Assembly 这个指令在内存中看起来如何?

Assembly 这个指令在内存中看起来如何?,assembly,x86,Assembly,X86,我在计算x86处理器的内存中该指令的外观时遇到困难 mov $0x3c,%eax 有人能帮我弄清楚吗 例如,一个简单的例子是: xor%edi,%edi-->0x31 0xFFIA32处理器具有默认代码大小,在16位代码段(或实模式)中为(猜测)16位。在32位和64位代码段中,它是32位的 像moveax,3ch这样的指令实际上类似于mova,3ch其中A是A寄存器(RAX,RAX,AX)。 指令mova,3ch被编码为0b8h操作数\u IN_LE,现在操作数\u IN_LE的代码大小为:

我在计算x86处理器的内存中该指令的外观时遇到困难

mov $0x3c,%eax
有人能帮我弄清楚吗

例如,一个简单的例子是:


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

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

moveax,3ch
这样的指令实际上类似于
mova,3ch
其中A是A寄存器(RAX,RAX,AX)。
指令
mova,3ch
被编码为
0b8h操作数\u IN_LE
,现在操作数\u IN_LE的代码大小为:16位或32位。
如果它是16位,您实际上正在向AX写入数据,如果它是32位到EAX

因此,
0b8h 3ch 00
是16位的
mov ax,3ch
,而
0b8h 3ch 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
,在32/64位代码中编码为
0b8h 3ch 00h 00h

为完整起见,指令
mov rax,3ch
编码为
48h b8h 3ch 00h 00h 00h 00h 00h
,仅在64位模式下可用


您可以参考从A到M的指令及其编码进行下载,包括
mov

查看是否有帮助。如果您只需要字节,那么当然可以使用任何汇编程序。而且。。。您始终可以使用运行汇编程序来生成列表并查看生成的代码字节。:)杰出的谢谢你们