mov指令的操作码与x86中预期的不同

问题描述

假设我有一条非常简单的说明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位寄存器时,需要操作数大小前缀。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...