我设法根据我上次创建的帖子中有用的人提供的解决方案添加了两位数的数字:
所以现在,当我添加2个数字时,似乎有一个问题,他们的结果将是一个3位数字。名为IS_3DIGIT的跳转处理这种可能性,但添加一些数字,如80 + 80,99 + 99,89 + 82都会产生错误的结果。 56 + 77效果很好。所以我的假设是,添加两个高于79的数字会得到错误的结果。我该如何解决这个问题?顺便说一句,99 + 23或89 + 43等附加内容可以得到正确的结果。
.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
MOV AL, CL
MOV AH, BL
ADD AL, DH
AAA
ADD AH, DL
MOV NUM1, AL
ADD NUM1, '0'
; if tens digit is less than or equal to 9
CMP AH, 9
JLE NOT_3DIGIT
IS_3DIGIT:
MOV AL, AH ; move value of ah to al
SUB AH, AH ; clear ah
ADD AL, 0 ; al + 0 = al (tens digit)
AAA ; move for addition
ADD AH, 0 ; ah + 0 + 1 = ah + 1 (hundreds digit)
MOV NUM2, AL
MOV NUM3, AH
ADD NUM2, '0'
ADD NUM3, '0'
; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h
MOV DL, NUM3
MOV AH, 02H
INT 21h
MOV DL, NUM2
MOV AH, 02H
INT 21h
JMP PRINT_LASTDIGIT
NOT_3DIGIT:
MOV NUM2, AH
ADD NUM2, '0'
; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h
MOV DL, NUM2
MOV AH, 02H
INT 21h
PRINT_LASTDIGIT:
MOV DL, NUM1
MOV AH, 02H
INT 21h
EXIT:
MOV AH, 4Ch
INT 21h
MAIN ENDP
END MAIN
答案 0 :(得分:1)
嗯,你做到了“艰难的道路”,真的。同样,aaa
可以完成所有艰苦的工作,只要正确的事情在ah
和al
中,所以不一定需要溢出和不溢出的不同情况。
像这样(未经测试):
; ah:al = tens:ones
add al,dh
aaa
; now make ah:al hundres:tens
mov bl,al
mov al,ah
xor ah,ah ; this will be the hundreds digit
add al,dl
aaa
; result in ah:al:bl
我从您的来源使用了dh
和dl
,bl
只是一些额外的地方。它们并不重要,但ah
和al
中的内容确实必须存在,就像上次一样。
我已经非常仔细地阅读了aaa
和add
的描述,并且我认为即使第二次添加可以为某些内容添加10,但仍应该有效我只有90%的确定。
答案 1 :(得分:0)
我认为可以通过其他方式完成。无需检查它是否已变为3位数。
PRINT MACRO MSG
LEA DX,MSG
MOV AH,09H
INT 21H
ENDM
READ MACRO N,J1,J2
J1: MOV AH,01H
INT 21H
CMP AL,0DH
JE J2
SUB AL,30H
MOV BL,AL
MOV AX,N
MOV DX,0AH
MUL DX
XOR BH,BH
ADD AX,BX
MOV N,AX
JMP J1
J2: NOP
ENDM
PRINTMUL MACRO N1,L2,L3
MOV BX,000AH
MOV AX,N1
XOR CX,CX
L2: XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0000H
JNE L2
L3: POP DX
ADD DL,30H
MOV AH,02H
INT 21H
LOOP L3
ENDM
.MODEL SMALL
.STACK 100H
.DATA
N DW 0
M DW 0
MS DB 0DH,0AH,"ENTER 1ST: $"
MT DB 0DH,0AH,"ENTER 2ND: $"
ANS DB 0DH,0AH,"ANSWER IS: $"
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
PRINT MS
READ N,U1,U2
PRINT MT
READ M,G1,G2
PRINT ANS
MOV AX,N
ADD AX,M
PRINTMUL AX,H1,J5
MAIN ENDP
END MAIN