如何使用一个变量添加 4 位数字并在 Assembly 中显示总和?

How to Add 4 digit numbers and display the sum in Assembly using one variable?

我用的是EMU8086。如何添加 4 位数字并使用一个变量在 Assembly 中显示总和?

DATA SEGMENT
     MSG1 DB "ENTER NUMBER WITH FOUR DIGITS : $"
     MSG2 DB 10,13,"RESULT : $"
     D1 DB ? 
     D2 DB ?
     D3 DB ?
     D4 DB ?
     SUM DB ?
     RES  DB 10 DUP ('$')
DATA ENDS
CODE SEGMENT 
    ASSUME DS:DATA CS:CODE
START:
      MOV AX,DATA
      MOV DS,AX

      LEA DX,MSG1         
      MOV AH,9
      INT 21H     

      MOV AH,1
      INT 21H
      SUB AL,30H
      MOV AH,0
      MUL AL
      MOV D1,AL

      MOV AH,1
      INT 21H
      SUB AL,30H
      MOV AH,0
      MUL AL
      MOV D2,AL

      MOV AH,1
      INT 21H
      SUB AL,30H
      MOV AH,0
      MUL AL
      MOV D3,AL

      MOV AH,1
      INT 21H
      SUB AL,30H
      MOV AH,0
      MUL AL
      MOV D4,AL

      ADD AL,D3
      ADD AL,D2
      ADD AL,D1      
      MOV SUM,AL 

      LEA SI,RES
      CALL HEX2DEC

      LEA DX,MSG2
      MOV AH,9
      INT 21H

      LEA DX,RES
      MOV AH,9
      INT 21H 

      MOV AH,4CH
      INT 21H     
CODE ENDS
HEX2DEC PROC NEAR
    MOV CX,0
    MOV BX,10

LOOP1: MOV DX,0
       DIV BX
       ADD DL,30H
       PUSH DX
       INC CX
       CMP AX,9
       JG LOOP1

       ADD AL,30H
       MOV [SI],AL

LOOP2: POP AX
       INC SI
       MOV [SI],AL
       LOOP LOOP2
       RET
HEX2DEC ENDP
END START

您提出的问题与您编写的代码不完全对应。如果您要添加几个 4 位数字,那么您当然需要输入多个这样的数字!请参阅附加部分。
因此,我得出结论,您可能只是对问题措辞不当,我将对您显示的代码发表评论:


您的程序将单个 4 位数字的 4 位相加。这意味着最大结果可以是 9+9+9+9,即 36。这个事实对于程序的其余部分很重要,因为它会影响指令的选择。

当您实际输入单个数字时,您会立即通过使用 mul al 指令对它们进行平方来销毁它们!

MOV AH,1
INT 21H
SUB AL,30H    ; From "0".."9" to 0..9
MOV AH,0      <-- Don't do this
MUL AL        <-- Don't do this
MOV D1,AL

将总和移动到 sum 变量没有实际意义,因为以后不会再这样使用它。但是您确实需要将 AL 寄存器扩展到 AX 的大小,因为转换例程需要 AX 作为输入:

ADD AL,D3
ADD AL,D2
ADD AL,D1      
MOV SUM,AL    <-- Maybe not needed?
CBW           <-- This clears AH (the high byte of AX) because AL is a very small number (less than 128)

LEA SI,RES
CALL HEX2DEC

我看到您已选择让转换例程 HEX2DEC 始终显示 2 个十进制数字。这很好。


额外

为了让您能够添加几个 4 位数字,我将添加代码以检索这些数字中的第一个。确保在 DATA 段中定义字大小的变量。

计算基于此公式:Number= D1*1000+D2*100+D3*10+D4

将两个数字相加并显示它们应该是一件轻而易举的事!

NUM1 DW ?
NUM2 DW ?
SUM  DW ?

...

MOV AH,1
INT 21H
SUB AL,30H
CBW
MOV DX,1000
MUL DX
MOV NUM1,AX

MOV AH,1
INT 21H
SUB AL,30H
CBW
MOV DX,100
MUL DX
ADD NUM1,AX

MOV AH,1
INT 21H
SUB AL,30H
MOV AH,10
MUL AH
ADD NUM1,AX

MOV AH,1
INT 21H
SUB AL,30H
CBW
ADD NUM1,AX