call指令的地址是怎么計算出來的。


:00401008 E801000000              call 0040100E
:0040100D C3                      ret

 

 call 0040100E的機器碼是E801000000,E8是CALL指令的opcode,后面的0100 0000是怎么和0040100e對應起來的。

其實01000000這是一個相對地址,並不是我想象的E8后面根一個絕對地址。 絕對地址=call指令的下條指令的地址+相對地址

call指令的下條指令的地址是0040100D+ 相對地址 這里是01000000,由於是little end 反過來就是00000001 

0040100D+00000001=0040100E

0040100E就是這么來的。

 

jz je等條件跳轉jmp等條件跳轉指令都是這么一個算法

跳轉或者call的絕對地址=call指令或跳轉指令的下一條指令的地址+ 相對地址(翻轉)

 

為什么要用相對地址,而不用絕對地址呢?我想的是重定位的問題,如果機器碼中使用了絕對地址,如果這段代碼被加載到了別的基址(HMODULE),機器碼中的絕對地址就必須要修改,否則就會跳轉到錯誤的地方執行而 如果選擇了相對地址,那么就不用修改這個地址,代碼會自動跳轉到正確的地方執行。

說到這里,全局變量用的就是絕對地址,所以如果加載到別的基址,就需要重定位,全局變量重定位需要重定位表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM