了解近呼叫指令编码

时间:2017-07-24 09:14:32

标签: assembly x86

通过反汇编一些二进制代码,我发现了近似调用指令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

1 个答案:

答案 0 :(得分:5)

作为Hans Passant suggested in his commentcall指令采用的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