我讀了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位,這是一個例外嗎?