x86 汇编 - 如何识别寄存器以注册指令

x86 assembly - how to identify register to register instructions

我正在尝试在给定的反汇编指令列表中识别所有寄存器到寄存器指令..

我正在使用 capstone 作为反汇编引擎。

检查 "Intel® 64 and IA-32 Architectures Software Developer’s Manual" 后,我发现我需要查看 MOD\RM 字节中的 MOD 位,如果它是 11b,那么指令在两个寄存器之间..

在我遇到下一条指令(十六进制)之前一直运行良好:

1) 81 EC 24 06 00 00 
2) 83 C4 30

根据顶点 (http://www.cenigma.org/4AM3UGY):

1) sub  esp, 0x624
2) add  esp, 0x30

在第一条指令中 MOD\RM='EC' (11101100b) 所以 MOD=11b 在第二条指令中 MOD\RM='C4' (11000100b) 所以又是 MOD=11b

而且都没有注册就注册!

我错过了什么?除了 MOD 位之外还有更多内容吗?

谢谢!

来自英特尔的手册:

If the instruction does not require a second [register/memory] operand, then the Reg/Opcode field may be used as an opcode extension. This use is represented by the sixth row in the tables (labeled “/digit (Opcode)”).

如果我们随后从相关 table 中的第一个示例说明中查找 EC,我们会发现它可以对应于您使用 ESP/SP/AHMM4/XMM4 的情况没有任何额外的 register/memory 操作数。在那种情况下,指令描述中应该有一个/5

然后转到同一手册中对 SUB 的描述,我们看到:

81 /5 id   SUB r/m32, imm32 

所以我们在这里得到的是从 32 位寄存器中减去 32 位立即数,它是 ESP/SP/AHMM4/XMM4 之一(当然,其中 ESP 是只有 32 位寄存器)。

有关详细信息,请参阅英特尔手册中的 2.1.5 ModR/M 和 SIB 字节 的寻址模式编码。