Язык ассемблера Switch Case

Я смотрю на код языка ассемблера оператора switch.

Я понимаю, как работает этот код и каковы случаи. У меня вопрос: как мне выбрать названия случаев?

Ниже приводится код языка ассемблера, за которым будет следовать моя его интерпретация. Мне просто нужно использовать таблицу переходов и заполнить имена кейсов.

    1 8048420: push %ebp
    2 8048421: mov %esp, $ebp
    3 8048423: mov 0x8(%ebp), %eax       // x
    4 8048426: mov 0xc(%ebp), %edx       // n
    5 8048429: sub $0x32, %edx           // so least value of case is 32
    6 804842c: cmp $0x5, %edx            // max value is 37
    7 804842f: ja 8048448 <switch+0x28>  // if >37, go to default
    8 8048431: jmp *0x80485d0(, %edx, 4)  //THIS RIGHT HERE ?
    9 8048438: shl $0x2, %eax             // CASE A
   10 804843b: jmp 804844b <switch+0x2b>  //break;
   11 804843d: sar $0x2, %eax             //CASE B
   12 8048440: jmp 804844b <switch+0x2b>  //break
   13 8048442: lea (%eax, %eax, 2), %eax  //CASE C
   14 8048445: imul %eax, %eax     
   15 8048448: add $0xa, %eax             //fall through to default
   16 804844b: pop %ebp                   //return
   17 804844c: ret

Таблица переходов, которую создает команда gdb: У меня вопрос: как мне выбрать названия случаев? Ниже приведена сборка ...

Я смотрю на код языка ассемблера оператора switch.

Я понимаю, как работает этот код и каковы случаи. У меня вопрос: как мне выбрать названия случаев?

Ниже приводится код языка ассемблера, за которым будет следовать моя его интерпретация. Мне просто нужно использовать таблицу переходов и заполнить имена кейсов.

    1 8048420: push %ebp
    2 8048421: mov %esp, $ebp
    3 8048423: mov 0x8(%ebp), %eax       // x
    4 8048426: mov 0xc(%ebp), %edx       // n
    5 8048429: sub $0x32, %edx           // so least value of case is 32
    6 804842c: cmp $0x5, %edx            // max value is 37
    7 804842f: ja 8048448 <switch+0x28>  // if >37, go to default
    8 8048431: jmp *0x80485d0(, %edx, 4)  //THIS RIGHT HERE ?
    9 8048438: shl $0x2, %eax             // CASE A
   10 804843b: jmp 804844b <switch+0x2b>  //break;
   11 804843d: sar $0x2, %eax             //CASE B
   12 8048440: jmp 804844b <switch+0x2b>  //break
   13 8048442: lea (%eax, %eax, 2), %eax  //CASE C
   14 8048445: imul %eax, %eax     
   15 8048448: add $0xa, %eax             //fall through to default
   16 804844b: pop %ebp                   //return
   17 804844c: ret

Таблица переходов, которую создает команда gdb: У меня вопрос: как мне выбрать названия случаев? Ниже приведена сборка ...

Я смотрю на код языка ассемблера оператора switch.

Я понимаю, как работает этот код и каковы случаи. У меня вопрос: как мне выбрать названия случаев?

Ниже приводится код языка ассемблера, за которым будет следовать моя его интерпретация. Мне просто нужно использовать таблицу переходов и заполнить имена кейсов.

    1 8048420: push %ebp
    2 8048421: mov %esp, $ebp
    3 8048423: mov 0x8(%ebp), %eax       // x
    4 8048426: mov 0xc(%ebp), %edx       // n
    5 8048429: sub $0x32, %edx           // so least value of case is 32
    6 804842c: cmp $0x5, %edx            // max value is 37
    7 804842f: ja 8048448 <switch+0x28>  // if >37, go to default
    8 8048431: jmp *0x80485d0(, %edx, 4)  //THIS RIGHT HERE ?
    9 8048438: shl $0x2, %eax             // CASE A
   10 804843b: jmp 804844b <switch+0x2b>  //break;
   11 804843d: sar $0x2, %eax             //CASE B
   12 8048440: jmp 804844b <switch+0x2b>  //break
   13 8048442: lea (%eax, %eax, 2), %eax  //CASE C
   14 8048445: imul %eax, %eax     
   15 8048448: add $0xa, %eax             //fall through to default
   16 804844b: pop %ebp                   //return
   17 804844c: ret

Таблица переходов, которую создает команда gdb: Я делаю x / 6w 0x80485d0

0x80485d0: 0x08048438 0x08048448 0x08048438 0x0804843d
0x80485e0: 0x08048442 0x08048445

Моя интерпретация:

int result = x;
switch(n) {
case __:
    x = x << 2;
    break;  
case __:
    x = x >> 2
    break;
case __:
    x = 4*x;
    x = x*x
case __: //default
    x += 0xa 
return x;
}

Я просто не понимаю, как искать таблицу переходов и решать, какие значения n от 32 до 37 подходят какому из регистров.

Любая помощь будет оценена. Спасибо.

8
задан skaffman 24 October 2010 в 14:03
поделиться