当前位置 : 主页 > 手机开发 > 无线 >

assembly – 无法将8位地址移动到16位寄存器

来源:互联网 收集:自由互联 发布时间:2021-06-10
我试图分配变量来注册这里是代码: 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
网友评论