【问题标题】:How to Add 4 digit numbers and display the sum in Assembly using one variable?如何添加 4 位数字并使用一个变量在 Assembly 中显示总和?
【发布时间】:2016-08-16 03:43:18
【问题描述】:

我正在使用 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

【问题讨论】:

  • “显示以下输出”你在那乱七八糟中展示了什么?
  • 请不要像您一样更改原始问题。这样的变化完全破坏了意义。如果您对同一问题还有其他疑问,请使用 cmets。

标签: assembly emu8086


【解决方案1】:

您提出的问题与您编写的代码不完全对应。如果您要添加几个 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

【讨论】:

  • 首先抱歉错误的提问方式然后请用emu(8086)编写完整的程序我是汇编语言的新手我什至不知道汇编的abc但这是我的问题请写完整程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2022-11-07
  • 2023-01-20
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多