x86 汇编 CALL 指令编码

x86 Assembly CALL Instruction Encoding

near, absolute 间接调用指令如何编码?

call r/m32

它的操作码是 FF /2 我知道 /2 是什么意思但是,它如何影响二进制形式的编码?这是否意味着我们将 ModR/M 字节中的第二位设置为 1?谁能给我一个完整的例子,说明如何对近间接调用进行编码?

call [0x12345678]

  • 操作码=0xFF
  • mod = 00b,reg = 010b,rm = 101b 所以 modrm = 0x15
  • disp32 = 0x12345678

因此,FF 15 78 56 34 12

/2 表示 modR/m 字节仅使用 mod 和 r/m 字段。该指令只有一个操作数。它是一个 32 位位移值。因此,mod = 00 和 r/m = 101(仅位移 mode) modR/m 字节的 reg 字段等于符号 /2 (reg = 010) 中 2 的二进制形式。

  ++++++++++++++++++++++++ 
  ||  Mod || Reg || R/M ||
  ++++++++++++++++++++++++
  ||  00  || 010 || 101 || = 15H
  ++++++++++++++++++++++++