Ven*_*Ven 4 x86 assembly x86-16 emu8086
我试图分配变量来注册这里是代码:
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
Run Code Online (Sandbox Code Playgroud)
但如果换掉第4行:
MOV BL, var1;
Run Code Online (Sandbox Code Playgroud)
有用.所以我的问题是为什么我不能将8位变量移动到更大的16位寄存器中?
注意:
为什么我不能将8位变量移动到更大的16位寄存器中?
因为机器代码MOV
指令需要源操作数和目标操作数大小相同.这是必需的,因为MOV
指令本身并未指定如何填充较大目标寄存器的剩余位.
为了允许不同尺寸的移动操作,Intel增加MOVZX
和MOVSX
80386的CPU,这允许更小的源操作数中(目标始终是一个32位寄存器).-SX和-ZX后缀表示应填充目标寄存器的先前未使用的位.
在16位Intel处理器上,有CBW
一条指令(Convert Byte to Word),它的符号范围从8位扩展到16位.不幸的是,这仅适用于累加器(寄存器AL/AX),因此您必须执行以下操作:
mov al,var1
cbw
mov bx,ax
Run Code Online (Sandbox Code Playgroud)
cbw
签名延期.如果你var1
是未签名的,你可以这样做:
mov bl,var1
xor bh,bh ; equivalent to mov bh,0 but faster and only one byte opcode
Run Code Online (Sandbox Code Playgroud)
或者,正如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
Run Code Online (Sandbox Code Playgroud)