通过反汇编一些二进制代码,我发现了近调用指令call 0x8ae
,它被编码为e8 97 08 00 00
。
查看指令集引用,我发现这些指令被编码为:
call XX XX XX XX <==> e8 XX XX XX XX
是XX XX XX XX
相对于下一条指令的32位位移。
我不明白为什么反汇编指令被编码为e8 97 08 00 00
。我本来期望的是 e8 ae 08 00 00
的编码。
最佳答案
如Hans Passant suggested in his comment ,call
指令采用的 32 位相对位移是相对于下一条指令的,因此反汇编器将其转换为它将引用的绝对地址。
考虑以下反汇编片段:
Address Encoded Disassembled
----------------------------------------------------
12: e8 97 08 00 00 call 0x8ae
17: 83 c4 0c add $0xc,%esp
call
指令的相对位移实际上是0x897
,如Encoded列中所示,但是由于这个偏移相对于call
的下一条指令,位于地址0x17
,然后反汇编器显示偏移量之和的结果(即: 0x897
)和下一条指令的地址(即:0x17
):
0x897 + 0x17 = 0x8ae
这正是反汇编程序实际显示的内容:call 0x8ae
。
关于assembly - 了解近调用指令编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45276612/