Я изучаю код языка ассемблера оператора 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 создает: Я делаю х/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 соответствуют, в каком из заготовок дела.
Любая помощь будет оценена по достоинству. Спасибо.
Обратите внимание, что '0x32' равен 50, а не 32. –
Я не уверен, что я понимаю проблему; вы уже сделали тяжелую работу! Первый элемент таблицы перехода соответствует «0x32», второй - «0x33» и т. Д. –
Не следует ли 'x = 4 * x' быть' x = 3 * x' (или, точнее, 'x = x + 2 * x')? – outis