了解近呼叫指令编码

眠りネ*_*ネロク 2 x86 assembly

通过反汇编一些二进制代码,我找到了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.

眠りネ*_*ネロク 5

正如汉斯帕桑特在他的评论暗示,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.