我无法弄清楚这条指令在x86处理器的内存中是如何看的。
mov $0x3c,%eax
有人可以帮我搞清楚吗?
例如,一个简单的是:
xor %edi,%edi
---> 0x31 0xFF
答案 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
。