我该如何在汇编中使用ADC?

5
.MODEL SMALL
.STACK 1000
.DATA

MSGA DB 13,10,"Input first number: ","$"
MSGB DB 13,10,"Input second number:","$"
MSGC DB 13,10,"The sum is: ","$"

NUM1 db ?
NUM2 db ?
NUM3 db ?

.CODE

MAIN PROC NEAR

MOV AX, @DATA
MOV DS, AX

; get first number
LEA DX, MSGA
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV BL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV CL, AL

; get second number
LEA DX, MSGB
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DH, AL

; add
ADD CL, DH 
ADC BL, DL
MOV NUM1, CL
ADD NUM1, '0'
MOV NUM2, BL
ADD NUM2, '0'

; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h

MOV DL, NUM2
MOV AH, 02H
INT 21h

MOV DL, NUM1
MOV AH, 02H
INT 21h

MOV AH, 4Ch
INT 21h

MAIN ENDP
END MAIN

以下是我为在汇编中添加两个两位数的代码。我想知道ADC为什么不起作用。如果个位数相加时没有进位,我的代码可以运行。但是如果有进位就不行了。我是否误解了ADC的真正作用?我该怎么修改我的代码?

1
ADC 在这里真的没有用,因为两个二位数相加永远不会产生无法装入字节的结果。 - m0skit0
我是说“适合”,不是“修复”,抱歉。 - m0skit0
2个回答

5

您似乎在使用十进制数学,但没有使用 AAAADC 可以按预期工作,但是使用该代码时,第一次加法从未实际发生进位(毕竟9+9并不大于255)。

因此,解决方案当然是使用 AAA,如下所示(未经测试):

add al,dl
aaa        ; takes no arguments and works on al
add ah,dh  ; adc not necessary, aaa already incremented ah if there was a carry

AAAASCII加法调整)测试al是否大于9,如果是:

  • 调整al
  • 设置进位标志,和
  • 增加ah

对不起,我对汇编语言还很陌生。aaa和xchg实际上是做什么的? - six.strings.and.a.bit
@jrmeasures 它交换(eXCHanGes)两个东西。 - harold
@jrmeasures 好吧,事实证明它做了一些我记不清的事情,所以我编辑了我的答案。 - harold
我真的需要使用al、dl、ah和dh吗? - six.strings.and.a.bit
@jrmeasures,你真的需要使用alah,你可以将d更改为你喜欢的任何值。 - harold

1

SO上查看此问题,答案解释了ADC - 带进位加法是如何工作的。基本上,您需要使用普通的ADD指令先加低位字节,然后再使用ADC(带进位加法)加高位字节,如果低位字节的加法产生了进位,则会加上进位。

例如,如果要将AX和BX相加,则应执行以下操作:

add  al, bl
adc  ah, bh   ; include the carry if previous add generated one

正如评论中提到的,您实际上是通过获取每个ASCII字符并从中减去'0'来执行十进制算术运算。 这些操作中的每一个都只会生成一个二进制数字,该数字在8位寄存器中存储,介于0和9之间。 如评论所述,将两个小于10的数字相加永远不会产生进位,这只有在结果大于256时才可能发生。

如果您继续使用执行此任务的方法,则需要手动检查两个低阶十进制数字的相加是否导致进位,方法是检查相加的结果是否大于10,如果确实如此,则从该数字中减去10,然后将1添加到高阶数字计算中。

听起来有道理吗?

这是作业吗?如果是,作业的目的是学习进位如何工作还是只是编写一个程序来将两个两位数相加?


请看一下我的代码,我有两行与那个示例完全相同的代码。 - six.strings.and.a.bit
请查看@harold发布的答案。他的解决方案更好,因为它使用了一条称为加法后ASCII调整的指令来完成您需要做的事情,并且还使用进位标志来完成您需要做的事情。 - HeatfanJohn
我只想编写一个程序,用于相加两位数。 - six.strings.and.a.bit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接