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

以上是我在汇编中添加 2 个两位数的代码。我想知道为什么ADC不起作用。如果添加时个位数未获得进位,则我的代码有效。但并非如此。我是否误解了 ADC 的真正作用?我应该如何处理我的代码?

4

2 回答 2

4

您似乎正在使用十进制数学,但您没有使用AAA. ADC符合您的期望,但是使用该代码,第一次加法永远不会有实际进位(毕竟 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

AAA( ASCII Adjust for Addition ) 测试是否al大于 9,如果是:

  • 调整al
  • 设置进位标志,并且
  • 增量ah
于 2012-07-19T14:39:59.067 回答
1

在此处查看此问题,答案解释了 ADC - Add with carry 的工作原理基本上,您需要首先使用普通的 ADD 指令将低位字节相加。然后使用 ADC 将高位字节相加(带进位相加),如果低位字节相加产生进位,ADC 将添加进位。

例如,如果您要添加 AX 和 BX,您将执行以下操作:

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

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

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

那有意义吗?

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

于 2012-07-19T14:31:27.903 回答