【问题标题】:Different opcode for mov instruction than expected in x86mov 指令的操作码与 x86 中的预期不同
【发布时间】:2020-11-05 20:19:34
【问题描述】:

假设我有一个非常简单的指令mov eax,12345h。我使用 fasm 组装它并生成了一个 bin 文件。当我使用十六进制编辑器检查上述指令的操作码时,它给出了66 B8 45 23 01 00 作为等效的十六进制代码。现在从我所拥有的studied 来看,我期望第一个字节是0xb8 来表示“将 32 位常量加载到 eax”指令,其余四个字节与上面相同。我提到的文章还指出,将 32 位常量加载到 eax 中的相同 0xb8 指令可以与 0x66 前缀一起使用以加载 16 位常量,但显然我没有加载 16 位常量我的程序。在我的情况下,生成的操作码仍然以66 作为第一个字节开始。现在我无法理解这个66 来自哪里?在 fasm 的情况下有什么不同的行为吗?

【问题讨论】:

    标签: assembly x86 opcode fasm mov


    【解决方案1】:

    66h 前缀字节是操作数大小前缀。在 32 位代码中使用时,它指定 16 位操作数大小,在 16 位代码中使用时,它指定 32 位操作数。

    所以您正在组装 16 位 x86 代码。将 32 位值加载到 32 位寄存器时,需要操作数大小前缀。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多