2015-05-24 64 views
0

我讀了AMD64手冊和附近部分,它說的CALL:呼叫附近的AMD64

對於64位模式下,操作數大小默認爲64位附近的電話。 E8操作碼 導致RIP = RIP + 32位有符號位移,並且FF/2操作碼結果爲 RIP =寄存器或存儲器的64位偏移量。沒有前綴可用於在64位模式下對32位的操作數大小進行編碼 。

看起來每次操作碼都是E8,接下來的32位用作偏移量,對嗎?我反編譯了一個程序,我試過了:

4003f0:  e8 3b 00 00 00   callq 400430 <[email protected]> 

根據手冊,目標地址應該是0x4003f0 + 0x3b。如果你嘗試的結果是0x40042b,但根據objdump它應該是0x400430。我嘗試了其他調用指令,並且缺少相同的4個字節,難道有人知道原因嗎?

另外:它表示操作數的大小默認是64位,然後說當操作碼是e8時只考慮32位,這是一個例外嗎?

回答

4

只是回答爲什麼它是0x400430而不是0x40042b。當指令從0x4003f0開始時,EIP計算基於其下一條指令,因此您必須將5(當前指令的長度)添加到EIP。

目標操作數指定代碼段中的絕對偏移量(距代碼段基址的偏移量)或相對偏移量(相對於EIP寄存器中指令指針當前值的帶符號位移;該值指向CALL指令後面的指令)。

(引自Intel手冊。)