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

时间:2016-02-22 17:24:43

标签: assembly x86 intel x86-16 capstone

我正在尝试识别在给定的分解指令列表中注册指令的所有寄存器。

我使用capstone作为dissasembler引擎。

在检查“英特尔®64和IA-32架构软件开发人员手册”后,我发现我需要查看MOD \ RM字节中的MOD位,如果是11b,则指令位于两个寄存器之间.. < / p>

工作正常,直到我遇到下一条指令(十六进制):

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位吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

来自英特尔的手册:

  

如果指令不需要第二个[寄存器/存储器]操作数,则Reg / Opcode字段可以用作操作码扩展。该用法由表中的第六行表示(标记为“/ digit(操作码)”)。

如果我们从相关表格中的第一个示例说明中查找EC,我们会发现它可以与您使用ESP/SP/AHMM4/XMM4但没有任何其他注册表的情况相对应/内存操作数。在这种情况下,指令说明中应该有/5

在同一本手册中转到SUB的说明,我们看到了这一点:

81 /5 id   SUB r/m32, imm32 

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

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