为什么我不能将 8 位变量移动到更大的 16 位寄存器中?
因为机器码MOV
指令需要源操作数和目标操作数的大小相同。这是需要的,因为MOV
指令本身并不指定如何填充较大目标寄存器的剩余位。
为了允许不同大小的移动操作,英特尔添加了MOVZX
and MOVSX
在 80386 CPU 中,它允许更小的源操作数(目标始终是 32 位寄存器)。 -SX 和 -ZX 后缀表示目标寄存器中先前未使用的位应填充的内容。
在 16 位 Intel 处理器上,有以下指令CBW
(将字节转换为字),将符号从 8 位扩展到 16 位。不幸的是,这仅适用于累加器(寄存器 AL/AX),因此您必须执行以下操作:
mov al,var1
cbw
mov bx,ax
cbw
进行符号扩展。如果你的var1
是未签名的,你可以简单地这样做:
mov bl,var1
xor bh,bh ; equivalent to mov bh,0 but faster and only one byte opcode
或者,正如彼得·科德斯所说:
xor bx,bx ;clear the whole destination register
mov bl,var1 ;update the least significant byte of the register with the 8-bit value