Tradução de Switch

1 view
Skip to first unread message

Stefan Teixeira

unread,
Oct 24, 2010, 8:38:20 PM10/24/10
to Comp-Prog
Não entendi direito como que funciona pra traduzir um switch pra
assembly. Esse jump table eu achei estranho...
Na aula 11, slide 22, como que funcionam esses "longs"? Pq ela
reservou 100 bytes na memória?

Fernando Silva

unread,
Oct 25, 2010, 2:57:05 AM10/25/10
to comp...@googlegroups.com
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.

Stefan Teixeira

unread,
Oct 25, 2010, 6:26:08 PM10/25/10
to comp...@googlegroups.com
Valeu cara, entendi, mas de qualquer jeito é muito complicado :P

Eu tentei gerar aqui o código assembly de um switch com 2 cases só, e ele não usou jump table, ele usou um if mesmo, estranho...

Outra dúvida, quando algum caso do switch tem "break", no código em assembly isso vai resultar no que?

Thomaz Barros

unread,
Oct 25, 2010, 6:29:40 PM10/25/10
to comp...@googlegroups.com
Não será um jmp para uma label para fora do switch (isso acontece no exemplo do slide 22 da aula 11)?

Stefan Teixeira

unread,
Oct 25, 2010, 6:36:33 PM10/25/10
to comp...@googlegroups.com
Cara eu não entendi ainda como que funciona o switch, olha o exemplo que eu gerei aqui:

Se alguém puder explicar +- o que o assembly tá fazendo no caso, agradeço.

int ex_switch (int x, int n) {
  int r = x;
  switch(n) {
    case 100:
    r = 13;
    break;
    case 102:
    r = 10;
    case 104:
    r = 5;
    break;    
  }
  return r;
}


ex_switch:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    8(%ebp), %eax
    movl    %eax, -4(%ebp)
    movl    12(%ebp), %eax
    cmpl    $102, %eax
    je    .L4
    cmpl    $104, %eax
    je    .L5
    cmpl    $100, %eax
    jne    .L2
.L3:
    movl    $13, -4(%ebp)
    jmp    .L2
.L4:
    movl    $10, -4(%ebp)
.L5:
    movl    $5, -4(%ebp)
.L2:
    movl    -4(%ebp), %eax
    leave
    ret

Felipe Faria

unread,
Oct 25, 2010, 6:50:36 PM10/25/10
to comp...@googlegroups.com
O Compilador simplificou seu programa substituindo o switch por ifs, eu acho...
Eu entendi ele fazer:
if(n=102){
r=10;
r=5;
} else if(n=104){
r=5;
}else if(n=100){
r=13;

Fernando Silva

unread,
Oct 25, 2010, 6:53:41 PM10/25/10
to comp...@googlegroups.com
É como ele falou, o compilador transformou seu case em uma série de ifs, que é uma forma de fazer.

A forma que está no slide é mais refinada, mas ambas podem ter vantagens sobre a outra, dependendo da situação, mas na dúvida, fazer uma série de ifs não está errado, a não ser que a professora peça explicitamente a outra forma.

Em 25 de outubro de 2010 20:36, Stefan Teixeira <stef...@gmail.com> escreveu:
Reply all
Reply to author
Forward
0 new messages