Assembly 将32位寄存器移到8位寄存器中

Assembly 将32位寄存器移到8位寄存器中,assembly,x86,nasm,cpu-registers,Assembly,X86,Nasm,Cpu Registers,我正试图将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,如下

我正试图将
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是一个32位寄存器。DX是EDX的下16位,DH是DX的上8位,DL是DX的下8位。不幸的是,如果我做“全局”开始部分。数据字符串db“testing”,0x00部分。文本开始:movzx edx,byte[string]mov eax,4mov ebx,1 mov ecx,edx mov edx,12 int 0x80…`它仍然输出整个字符串,如果我尝试`。。。xor eax,eax mov al,[字符串]xor edx,edx mov dl,al。。。mov ecx,edx…`它没有输出任何东西,我还在学习这门语言,有什么想法我做错了什么吗?@JOhn-这是一个单独的问题,我不会在评论中详细说明。