5

我设法根据我上次创建的线程中乐于助人的人提供的解决方案添加了两位数:

如何在汇编中使用 ADC?

所以现在,当我添加 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
4

2 回答 2

1

好吧,你确实做到了“艰难的方式”。同样,aaa只要正确的事情在ahand中,就可以完成所有艰苦的工作,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

我使用了你dhdl来源,bl只是一些额外的地方。它们并不重要,但里面的东西ah确实al必须在那里,就像上次一样。

我已经非常仔细地阅读了aaa和的描述,我认为即使第二次添加可以将 10 添加到某物上,这也应该有效,但我对此只有大约 90% 的把握。add

于 2012-07-20T09:37:10.273 回答
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
于 2017-11-17T21:26:41.783 回答