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
++++++++++++++++++++++++
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
++++++++++++++++++++++++