簡體   English   中英

在amd64附近打電話

[英]Call near in amd64

我正在閱讀amd64手冊,並且在CALL附近的部分中說:

對於64位模式下的近距離調用,操作數大小默認為64位。 E8操作碼產生RIP = RIP + 32位有符號位移,而FF / 2操作碼產生RIP =與寄存器或存儲器的64位偏移。 沒有前綴可用於在64位模式下編碼32位操作數大小。

看起來每次操作碼為E8時,接下來的32位都將用作偏移量,對嗎? 我反匯編了一個程序,然后嘗試:

  4003f0:       e8 3b 00 00 00          callq  400430 <__gmon_start__@plt>

根據手冊,目標地址應為0x4003f0 + 0x3b。 如果您嘗試結果為0x40042b,但根據objdump,結果應為0x400430。 我嘗試了其他呼叫指令,但缺少相同的4個字節,有人知道原因嗎?

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

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

目標操作數指定代碼段中的絕對偏移量(距代碼段基數的偏移量)或相對偏移量(相對於EIP寄存器中指令指針當前值的有符號偏移;此值指向CALL指令之后的指令)。

(引自《英特爾手冊》。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM