【问题标题】:Adding 2 two-digit numbers that results to a 3-digit in assembly在汇编中添加 2 个两位数,结果为 3 位
【发布时间】:2012-07-20 08:22:11
【问题描述】:

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

How do I use ADC in assembly?

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

【问题讨论】:

    标签: assembly


    【解决方案1】:

    嗯,你确实做到了“艰难的方式”。同样,aaa 可以完成所有艰苦的工作,只要正确的事情在 ahal 中,因此溢出和不溢出的不同情况并不是真正需要的。

    类似这样的东西(未经测试):

    ; 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 只是一些额外的地方。它们并不重要,但ahal 中的内容确实必须存在,就像上次一样。

    我已经非常仔细地阅读了 aaaadd 的描述,并且我认为即使第二次添加可以将 10 加到某些东西上,它也应该可以工作,但我只是大约 90% 的人对此有把握。

    【讨论】:

    • 现在我终于明白了。我不知道异或。我还有很多东西要学。感谢您的帮助。
    • 不客气,@jrmeasures。 xor 在那里并不重要——它只是将ah 设置为零,就像你对sub 所做的那样。
    • DIV 的 AAD 怎么样?据我所知,AL 寄存器用于商,AH 将用于余数。我应该如何使用 AAD?
    • @jrmeasures 它基本上只执行ax = (al + 10 * ah) & 0xFF。如果ah:al 是一对十进制数字,ax 将在aad 之后保存它的二进制表示。 aam 则相反——它将al 解压缩为两位十进制数字(或者它至少尝试这样做。显然在 99 之后出现问题)。这对于我要说的另一个问题来说真的很重要,也许是关于十进制数学的一般问题?
    • 如果我想从我的电脑控制 BCD-led,所有这些信息都会很棒。或者如果我想要 custom_printf
    【解决方案2】:

    我认为它可以通过其他方式完成。无需检查是否已变为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2014-07-03
      相关资源
      最近更新 更多