将 32 位寄存器移动到 8 位寄存器

Move 32bit register into a 8 bit register

我正在尝试将 edx 移动到 al,但出现此错误

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

这是代码

mov edx, 0x41
mov al, edx

提前致谢

问题出在第二行:

mov al, edx

edx寄存器是32位的,而al是8位的,所以不能直接移入另一个。如果要将 edx 的低 8 位移动到 dl,请执行以下操作:

mov al, dl

或者您可能想将所有 edx 移动到 eax,如下所示:

mov eax, edx

区别是第一个选项保留eax的高24位不变,而第二个选项将它们设置为与edx.

的相应位相同

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

movzx eax, dl

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

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