mov 指令的操作码与 x86 中的预期不同
Different opcode for mov instruction than expected in x86
假设我有一个非常简单的指令 mov eax,12345h
。我使用 fasm 组装它并生成了一个 bin 文件。当我使用十六进制编辑器检查上述指令的操作码时,它给出了 66 B8 45 23 01 00
作为等效的十六进制代码。现在根据我的 studied,我期望第一个字节是 0xb8
来表示“将 32 位常量加载到 eax”指令,其余四个字节与上面相同。我提到的文章还指出,将 32 位常量加载到 eax 中的相同 0xb8
指令可以与 0x66
前缀一起使用以加载 16 位常量,但显然我没有加载我程序中的 16 位常量。在我的例子中,生成的操作码仍然以 66
作为第一个字节开头。现在我无法理解这个 66
是从哪里来的?在 fasm 的情况下是否有任何不同的行为?
66h
前缀字节是操作数大小前缀。在 32 位代码中使用时,它指定 16 位操作数大小,在 16 位代码中使用时,它指定 32 位操作数。
所以您正在组装 16 位 x86 代码。将 32 位值加载到 32 位寄存器时,需要操作数大小前缀。
假设我有一个非常简单的指令 mov eax,12345h
。我使用 fasm 组装它并生成了一个 bin 文件。当我使用十六进制编辑器检查上述指令的操作码时,它给出了 66 B8 45 23 01 00
作为等效的十六进制代码。现在根据我的 studied,我期望第一个字节是 0xb8
来表示“将 32 位常量加载到 eax”指令,其余四个字节与上面相同。我提到的文章还指出,将 32 位常量加载到 eax 中的相同 0xb8
指令可以与 0x66
前缀一起使用以加载 16 位常量,但显然我没有加载我程序中的 16 位常量。在我的例子中,生成的操作码仍然以 66
作为第一个字节开头。现在我无法理解这个 66
是从哪里来的?在 fasm 的情况下是否有任何不同的行为?
66h
前缀字节是操作数大小前缀。在 32 位代码中使用时,它指定 16 位操作数大小,在 16 位代码中使用时,它指定 32 位操作数。
所以您正在组装 16 位 x86 代码。将 32 位值加载到 32 位寄存器时,需要操作数大小前缀。