Указатель звездочки в сборке (I32/x86)

Оскорбительная строка:

 8048f70:   ff 24 85 00 a4 04 08    jmp    *0x804a400(,%eax,4)

В дизассемблированном коде по адресу 804a400 инструкции нет (мой список заканчивается на 804a247)

Когда я проверяю, что находится в этом месте памяти, я получаю:

(gdb) x/c 0x804a40c
0x804a40c:  -103 '\231'

(gdb) x/t 0x804a40c
0x804a40c:  10011001

(gdb) x/s 0x804a40c
0x804a40c:   "\231\217\004\b\222\217\004\b\211\217\004\b\202\217\004\bw\217\004\b\002"

(gdb) x/3x 0x804a40c
0x804a40c:  0x99    0x8f        0x04

Что именно пытается сделать этот оператор jmp?


person user1175133    schedule 11.10.2012    source источник


Ответы (1)


Эта инструкция является непрямым переходом. Это означает, что указанный адрес памяти является не целью перехода, а указателем на цель перехода.

Сначала инструкция загружает значение по адресу памяти:

*0x804a400(,%eax,4)

что более разумно записать как:

0x804a400 + %eax * 4  // %eax can be negative

А затем установите %eip на это значение.

Лучший способ расшифровать их — использовать Справочное руководство для программистов Intel. В таблице 2-2 в томе 2A представлена ​​разбивка байта ModR/M, а в данном случае также байта SIB.

person srking    schedule 11.10.2012