2010-10-24 1 views
3

Я изучаю код языка ассемблера оператора 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 соответствуют, в каком из заготовок дела.

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

+0

Обратите внимание, что '0x32' равен 50, а не 32. –

+0

Я не уверен, что я понимаю проблему; вы уже сделали тяжелую работу! Первый элемент таблицы перехода соответствует «0x32», второй - «0x33» и т. Д. –

+1

Не следует ли 'x = 4 * x' быть' x = 3 * x' (или, точнее, 'x = x + 2 * x')? – outis

ответ

5

Как говорит Оли, делать нечего. n-50 хранится в% edx, затем переключатель + 0x11 переходит на адрес, хранящийся в 0x80485d0 + %edx * 4. Глядя на таблицу, это переключатель + 0x18, когда n == 50 или 52, switch + 0x28 при n == 51, switch + 0x1d, когда n == 53, switch + 0x22 при n == 54 и switch + 0x25, когда n = = 55.

1

Таблица перехода имеет 6 значений, 5 из которых различны (при этом существует 5 случаев, включая значение по умолчанию 0x8048448). Первый и третий (которые соответствуют 0x32 и 0x34) идут в первый случай, второй (0x33) в последний (пятый) случай, четвертый (0x35) во второй случай, пятый (0x36) - в третий случай , а шестой (0x37) - четвертый. Все остальное относится к последнему (пятому) случаю, делая это по умолчанию.

switch (n) 
{ 
    case 0x32: 
    case 0x34: 
    x <<= 2; 
    break; 
    case 0x35: 
    x >>= 2; 
    break; 
    case 0x36: 
    x *= 3; 
    case 0x37: 
    x *= x; 
    //case 0x33: // not really necessary 
    default: 
    x += 10; 
} 
return x; 

 Смежные вопросы

  • Нет связанных вопросов^_^