【问题标题】:Adding 8 bit numbers in two registers (8 bit as well, 16 bit not allowed to use)在两个寄存器中添加 8 位数字(8 位也是如此,16 位不允许使用)
【发布时间】:2019-09-06 15:37:16
【问题描述】:

我正在做一个作业,我需要添加 x 个 8 位,结果必须存储在两个寄存器中(以防溢出)。如何在两个寄存器中设置结果? (我用内存填充数据)

对不起,我是组装新手,欢迎任何指导。

到目前为止,我已经添加了数字,但结果存储在一个寄存器中。

org 100
Mov al,[0x0300]
Mov ah,[0x0301]
xor dh,dh
add dh,al
add dh,ah

我希望结果存储在两个寄存器中而不是一个(因此可以存储 8 位以上的结果)。

【问题讨论】:

  • 当你做一个添加时,除了目标寄存器,还有什么会改变?你能用它来弄清楚如何处理你的第二个结果寄存器吗?
  • 如果加法溢出8位大小,第二个寄存器必须存储部分结果

标签: assembly emu8086


【解决方案1】:
org 100
Mov al,[0x0300]
Mov ah,[0x0301]
xor dh,dh
add dh,al
add dh,ah

您需要处理因添加 2 个字节大小的值而产生的进位:

首先清除将保存结果的2个寄存器

xor al, al
xor ah, ah

然后添加所有需要处理的值:

add al, [0x0300]
adc ah, 0

add al, [0x0301]
adc ah, 0

处理传播进位的是ADC(带进位加)指令!

您可以通过以下代码避免单独的清除步骤:

mov al, [0x0300]
xor ah, ah

add al, [0x0301]
adc ah, 0

【讨论】:

  • 那么,例如,如果 [0x0300] 包含 FF 并且 [0x0301] 也包含 FF,那么 al 和 ah 是否会携带总结果? (喜欢用斧头代替吗?)
  • @PepoPapo 使用这些值,您将获得 AL=0xFEAH=0x01。与AX=0x01FE相同。
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2021-04-05
  • 2017-07-12
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2013-05-14
相关资源
最近更新 更多