将 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
。
我正在尝试将 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
。