.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
Run Code Online (Sandbox Code Playgroud)
以上是我在汇编中添加2位两位数的代码.我想知道为什么ADC无效.如果这些数字在添加时没有获得进位,我的代码就可以工作.但不是这样.我误解了ADC真正的作用吗?我该怎么处理我的代码?
您似乎正在使用十进制数学,但您没有使用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
Run Code Online (Sandbox Code Playgroud)
AAA( ASCII 调整加法) 测试是否al大于 9,如果是:
al,ah