我试图分配变量来注册这里是代码: ORG 100h var1 DB 10 ; var2 DB 20 ; MOV BX,var1 ; error : operands do not match: 16 bit register and 8 bit addressRETEND 但如果换掉第4行: MOV BL, var1; 有用.所以我的问题是为什
ORG 100h var1 DB 10 ; var2 DB 20 ; MOV BX,var1 ; error : operands do not match: 16 bit register and 8 bit address RET END
但如果换掉第4行:
MOV BL, var1;
有用.所以我的问题是为什么我不能将8位变量移动到更大的16位寄存器中?
我已经提到了this,this和this OP,但它没有回答我的问题.
注意:
>我正在使用emu8086汇编程序
>我是汇编语言的新手,所以如果这是一个愚蠢的问题我会道歉.
why can’t I move 8 bit variable into much larger 16 bit register?
因为机器代码MOV指令需要源操作数和目标操作数大小相同.这是必需的,因为MOV指令本身并未指定如何填充较大目标寄存器的剩余位.
为了允许不同大小的移动操作,英特尔在80386 CPU中添加了MOVZX和MOVSX,它允许更小的源操作数(目标始终是32位寄存器). -SX和-ZX后缀表示应填充目标寄存器的先前未使用的位.
在16位Intel处理器上,有指令CBW(Convert Byte to Word),它的符号从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
或者,正如Peter Cordes所述:
xor bx,bx ;clear the whole destination register mov bl,var1 ;update the least significant byte of the register with the 8-bit value