1

以下操作码的指令是什么?

81 3E 38 43 55 AA 5A 5A

我在 Sandphile 中检查了这些操作码

81 is CMP opcode 
3E is DS segment register override prefix
43 38 is offset
55 AA 5A 5A is operand

根据沙堆我应该得到这样的结果:

cmp [0x4338], 0x55AA5A5A

和最终解释指令:

cmp [0x4338], 0x55AA5A5A

但是当我检查 rasm 和 gdb 时,我得到了这样的错误结果:

rasm2 -a x86 -b 32 -d "81 3E 38 43 55 AA 5A 5A"
cmp dword [esi], 0xaa554338
pop edx
pop edx

与 gdb

x/i 0x5555567da960
   0x5555567da960:  cmpl   $0xaa554338,(%rsi)
4

1 回答 1

2

3E是段覆盖前缀,这意味着它应该在开头作为前缀。因为它遵循操作码,所以它是一个 modr/m 字节,因此意味着[esi]和操作码扩展名/7imm32. 所以这是一个cmp [esi], imm32指令。

有关详细信息,请参见图 2-1。英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷:指令集参考,AZ中的英特尔 64 和 IA-32 架构指令格式和整个第 2 章指令格式

PS:您应该指定您使用的模式,16、32 或 64 位。

于 2019-07-14T18:31:57.983 回答