首页 > 解决方案 > 将 32 位寄存器移动到 8 位寄存器中

问题描述

我想搬进edxal,但我收到了这个错误

lib/io/print.asm:50: error: invalid combination of opcode and operands

这是代码

mov edx, 0x41
mov al, edx

提前致谢

标签: assemblyx86nasmcpu-registers

解决方案


问题是第二行:

mov al, edx

edx寄存器是 32 位的,但是是al8 位的,所以你不能直接将一个移到另一个。如果要将低 8 位移edxdl,请执行以下操作:

mov al, dl

或者,也许您想将所有内容edx移入eax,如下所示:

mov eax, edx

不同之处在于第一个选项使 的高 24 位eax保持不变,而第二个选项将它们设置为与 的相应位相同edx

如果您不关心高 24 位,例如,因为您不打算使用它们,或者因为您知道它们在任何一种情况下都为零,那么第二个选项可能会稍微快一些,因为它打破了对前一个的依赖的值eax,所以它可以在准备好后立即执行edx,而不管eax之前发生了什么。

movzx eax, dl

MOVZX 具有避免对 AL 目标的错误依赖的相同好处,同时仅从 EDX 中获取一个字节并将其零扩展。您想要的字节在 AL 中。

如果您想要源 EDX 的不同字节,您可以移动和移位,或movzx eax, dh.


推荐阅读