通过反汇编一些二进制代码,我发现了近似调用指令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
。
答案 0 :(得分:5)
作为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
,可以在编码列中看到,但由于此偏移是相对的到call
的下一条指令(位于地址0x17
),然后反汇编程序显示偏移量总和的结果(即:0x897
)和下一条指令指令的地址(即:0x17
):
0x897 + 0x17 = 0x8ae
这正是反汇编程序实际显示的内容:call 0x8ae
。