通过反汇编一些二进制代码,我找到了call 0x8ae编码为的近调用指令e8 97 08 00 00.
查看指令集引用我发现这些指令编码为:
call XX XX XX XX <==> e8 XX XX XX XX
Run Code Online (Sandbox Code Playgroud)
是XX XX XX XX相对于下一条指令的32位位移.
我不明白为什么反汇编指令被编码为e8 97 08 00 00.我原本期望编码e8 ae 08 00 00.
正如汉斯帕桑特在他的评论暗示,32位相对位移的call指令需要是相对于下一条指令,因此反汇编器将其转换为它会参考的绝对地址.
请考虑以下反汇编代码段:
Address Encoded Disassembled
----------------------------------------------------
12: e8 97 08 00 00 call 0x8ae
17: 83 c4 0c add $0xc,%esp
Run Code Online (Sandbox Code Playgroud)
call指令的相对位移实际上0x897可以在编码列中看到,但由于此偏移量是相对于call位于地址的下一条指令,因此0x17反汇编程序显示偏移量总和的结果(即:) 0x897和下一条指令的地址(即:) 0x17:
0x897 + 0x17 = 0x8ae
这正是反汇编程序实际显示的内容:call 0x8ae.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |