gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:58:53 30 4
gpt4 key购买 nike

我正在尝试分配变量来注册这里是代码:

       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 , thisthis OP,但它没有回答我的问题。

注意:
  • 我正在使用 emu8086 汇编器
  • 我是汇编语言的新手,所以如果这是一个愚蠢的问题,我深表歉意。
  • 最佳答案

    why can’t I move 8 bit variable into much larger 16 bit register?



    因为机器码 MOV指令需要源操作数和目标操作数的大小相同。这是必需的,因为 MOV指令本身不指定如何填充较大目标寄存器的剩余位。

    为了允许不同大小的移动操作,英特尔添加了 MOVZXMOVSX在 80386 CPU 中,它允许较小的源操作数(目标始终是 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

    关于assembly - 无法将 8 位地址移动到 16 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959446/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com