x86汇编中的操作数大小冲突?

时间:2010-04-13 00:45:16

标签: assembly x86

我是第一次尝试组装的新手程序员。如果这是一个令人难以置信的蹩脚问题,请提前抱歉。

我有一个存储在EAX寄存器中的字符,但是我需要把它移到我的DL寄存器中。当我尝试:mov dl,eax我得到一个错误C2443:操作数大小冲突。我知道eax寄存器是32位而dl是8位...我正在做什么?我该如何解决这个问题。

3 个答案:

答案 0 :(得分:12)

你想要的可能是:

movzx edx, al

这会将al复制到dl,零填充edx的其余部分。这条单指令等同于这两条指令:

xor edx, edx 
mov dl, al

答案 1 :(得分:6)

尝试

xor edx,edx
mov dl, al

也许?第一条指令将edx的“非必要”高位(可选)清零,然后将低位8从eax移到edx。

正如其他人所指出的那样,movzx只需一步即可完成。值得一提的是,沿着相同的行,如果你在al中有 signed 值,你可以使用“movsx edx,al”来填充edx的高位,并使用alb的msb的副本从而将al的带符号32位表示放入edx。

答案 2 :(得分:3)

如果您只想访问eax的低8位,请使用al:

mov dl, al

您可以通过更改开头或结尾处的字母来访问每个通用寄存器的低8位,16位或32位。对于寄存器eax,使用eax意味着使用全部32位,ax是低16位,al是低8位。 ebx的等价物分别是ebx,bx和bl,依此类推。

注意,如果修改寄存器的低16位或8位,则高位不变。例如,如果你在eax中加载所有的,然后将0加载到al,则eax的低8位将为0,而高24位将为1。

mov eax, -1 ; eax is all ones
mov al, 0 ; higher 24 bits are ones, lower 8 bits are zeros