Foi mal a demora na resposta, a luz acabou aqui em casa.
Então, acredito que a dúvida toda está nessa duas linhas aqui:
JMP *.L7(,%edx,4)
.L7: .long .L3 .long .L2 .long .L4 .long .L9 .long .L6 .long .L2 .long .L6
vamos começar pela segunda linha:
O que o comando .long faz é reservar na memoria, espaço para guardar um long, ou seja, 4 bytes, e nessas possições que estam sendo reservadas, estão sendo colocadas os valores dos labels, então a memória ficou a segunite:
obs: Assumindo que .L7 aponte para a posição 0x200 da memória
0x200 [ .L3 ]
0x204 [ .L2 ]
0x208 [ .L4 ]
0x212 [ .L9 ]
0x216 [ .L6 ]
0x220 [ .L2 ]
0x224 [ .L6 ]
A instrução JMP *.L7(,%edx,4) está efetivamente dizendo: desvie usando o label, que é apontado por .L7(,%edx,4), ou seja, ele vai buscar um label na posição .L7 + %edx * 4 da memória, logo:
Se edx = 0; .L7 + %edx *4 = 0x200
Se edx = 1; .L7 + %edx *4 = 0x204
e assim por diante.
Qualquer dúvida é só falar.