assembly - 了解近调用指令编码

标签 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 的编码。

最佳答案

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,如Encoded列中所示,但是由于这个偏移相对于call的下一条指令,位于地址0x17,然后反汇编器显示偏移量之和的结果(即: 0x897)和下一条指令的地址(即:0x17):

0x897 + 0x17 = 0x8ae

这正是反汇编程序实际显示的内容:call 0x8ae

关于assembly - 了解近调用指令编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45276612/

相关文章:

assembly - 为什么我必须检查有符号操作的溢出标志而不是 8086 中的进位标志?

x86 - 有没有一种有效的方法来使用SIMD内部函数获取SIMD寄存器中的第一个非零元素?

x86 - 障碍/围栏和获取、释放语义是如何在微架构上实现的?

c - 一些由clang生成的程序集不能在实模式下工作(.COM,微小内存模型)

assembly - 为什么LDR指令中的标签需要减1?

java - 使用 java asm 库检测 "import"

assembly - 如何理解 x86-64 汇编的 'REX.W + B8+ rd io' 形式?

assembly - 真机操作系统

x86 - 交叉编译的 Valgrind 没有检测到明显的泄漏

c - 如何将 Intel Assembly C 转换为 AT&T C++