【问题标题】:Move an 8 bit register to a 16 bit memory location, how?将 8 位寄存器移动到 16 位内存位置,如何?
【发布时间】:2013-05-04 08:25:46
【问题描述】:

我在将 8 位寄存器移动到 16 位寄存器时遇到问题。

我要做的是将一个数字反复除以 10 直到它小于 10,并且在每个除法时间内,我尝试将除法的剩余部分从 AH 寄存器中移出,加 48给它,然后我可以获得它的 Ascii 代码,然后我尝试在屏幕上显示我得到的数字。

 Num1 DW 255
 DIVISION :
        CMP NUM1,10
            Jl DIVEND
            
        MOV AX,10
        DIV NUM1
        MOV NUM1,AL    ;*  Operand types do not match
    
        
        ADD AH,48
        MOV DL,AH; 
        MOV AH,02H
        INT 21H
        
    JMP DIVISION

但是,当我尝试组装它时,它会在 * 指示的行上显示Operand types do not match

我正在使用 turbo assembler V4.1 ...

【问题讨论】:

  • 不太记得 Turbo Assembler 的内容,但您尝试过 MOV BYTE NUM1,AL 吗?
  • 我不明白你在做什么 MOV NUM1,AL 正在将 AL 的内容移动到 NUM1 中?这不可能发生吧?
  • @PreetSangha 是的,我只是看语法就完全错过了 :)
  • 解决了你的问题吗?
  • 您将 10 除以 255。我假设您想将 255 除以 10。

标签: assembly x86-16 tasm 8-bit


【解决方案1】:

至于标题中更一般的问题:您对无符号值使用movzx(移动零扩展),对有符号值使用movsx(移动符号扩展)。

【讨论】:

  • 我更改了问题标题以反映代码;标题不正确,与接受的答案不符。但是,是的,对于一个字 movzx 或 movsx 都很好。 (对于商店,您可以扩展到更广泛的寄存器并存储它。)
【解决方案2】:

你是这个意思吗?

mov bx, Offset Num1 
mov [bx], al

您得到的错误是因为您声明了一个单词但将其作为一个字节来寻址。如果你做了 Num1 db,它也可以工作。

使用 TASM 4.1 测试

【讨论】:

  • 不必将地址放入寄存器中(在汇编程序的构建时大小检查中隐藏它)。你可以用mov byte ptr [Num1], al 覆盖大小,告诉汇编器你是认真的。当然,对于像这样的简单情况,通常您不想只存储您声明的部分存储空间。所以使用db 会是更好的方法。
  • 所以基本上这个当前的答案会消除错误,但不能解决可能的问题,这是危险的。
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2011-01-15
相关资源
最近更新 更多