问题描述
假设我有一条非常简单的说明mov eax,12345h
。我使用fasm组装了它并生成了一个bin文件。当我使用十六进制编辑器检查以上指令的操作码时,它给出了66 B8 45 23 01 00
作为等效的十六进制代码。现在,从我拥有的studied中,我期望第一个字节为0xb8
,以表示“将32位常量加载到eax中”指令,其余四个字节与上述相同。我提到的aritcle还指出,同一条0xb8
指令会将32位常量加载到eax中,可以与0x66
前缀一起使用,以加载16位常量,但显然我没有加载我程序中的16位常量。就我而言,最终的操作码仍以66
作为第一个字节开头。现在我无法理解这个66
来自何处?发生狂喜时有其他不同的行为吗?
解决方法
66h
前缀字节是操作数大小前缀。在32位代码中使用时,它指定16位操作数大小;在16位代码中使用时,它指定32位操作数。
因此,您正在组装16位x86代码。将32位值加载到32位寄存器时,需要操作数大小前缀。