我是第一次尝试组装的新手程序员。如果这是一个令人难以置信的蹩脚问题,请提前抱歉。
我有一个存储在EAX寄存器中的字符,但是我需要把它移到我的DL寄存器中。当我尝试:mov dl,eax我得到一个错误C2443:操作数大小冲突。我知道eax寄存器是32位而dl是8位...我正在做什么?我该如何解决这个问题。
答案 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