该指令在内存中如何显示?

时间:2015-06-16 16:45:19

标签: assembly x86

我无法弄清楚这条指令在x86处理器的内存中是如何看的。

mov $0x3c,%eax

有人可以帮我搞清楚吗?

例如,一个简单的是:

xor %edi,%edi ---> 0x31 0xFF

1 个答案:

答案 0 :(得分:3)

IA32处理器具有默认代码大小,16位代码段(或实模式)是(猜测)16位。在32位和64位代码段中,它是32位。

mov eax, 3ch这样的指令实际上类似于 mov A, 3ch,其中A是A寄存器(RAX,RAX,AX)。
指令mov A, 3ch编码为0b8h OPERAND_IN_LE,现在OPERAND_IN_LE的代码大小为:16位或32位。
如果它是16位,你实际上写入AX,如果它是32位到EAX。

所以0b8h 3ch 00在16位中为mov ax, 3ch,而0b8h 3ch 00h 00h 00h在32位中为mov eax, 3ch。请注意,这两条指令是相同的,CPU根据当前代码大小获取16/32位操作数。

您可以使用数据大小前缀66h覆盖默认代码大小。使用此前缀,将执行下一条指令,例如代码大小为"其他指令" (即16位代码为32位,32位代码为16位)。还有一个REX前缀可以访问完整的64位寄存器。

因此,指令mov eax, 3ch在16位代码中编码为66h 0b8h 3ch 00h 00h 00h,在32/64位代码中编码为0b8h 3ch 00h 00h 00h

为了完整起见,指令mov rax, 3ch被编码为48h b8h 3ch 00h 00h 00h 00h 00h 00h 00h,并且只能在64位模式下使用。

您可以下载Intel Manual Vol2A并参考说明及其编码,从A到M,包括mov