2012-10-11 62 views
4

出錯行:Asterisk的指針在大會(I32/86)

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聲明意欲何爲?

回答

9

該指令是間接跳轉。這意味着指定的內存地址不是跳轉目標,而是指向跳轉目標的指針。

首先,指令存儲器地址加載值:

*0x804a400(,%eax,4) 

其更明智地寫爲:

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

然後是%EIP設置爲該值。

解密這些文件的最好方法是使用「英特爾程序員參考手冊」。卷2A中的表2-2提供了一個ModR/M字節的分解,在這種情況下也是SIB字節。