我正在尝试识别在给定的分解指令列表中注册指令的所有寄存器。
我使用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位吗?谢谢!
答案 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字节的寻址模式编码。