: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),機器碼中的絕對地址就必須要修改,否則就會跳轉到錯誤的地方執行而 如果選擇了相對地址,那么就不用修改這個地址,代碼會自動跳轉到正確的地方執行。
說到這里,全局變量用的就是絕對地址,所以如果加載到別的基址,就需要重定位,全局變量重定位需要重定位表
