汇编实验1 两个多位十进制数相加的实验

两个多位十进制数相加的实验

将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。

;定义宏实现回车功能
;实现辅助显示字符串功能
CRLF    MACRO
        MOV    DL,0DH
        MOV    Ah,02H
        INT    21H
        MOV    DL,0AH
        MOV    AH,02H
        INT    21H
ENDM  
;====================================
DATA     SEGMENT  ;数据段的定义
DATA1    DB  33H,39H,31H,37H,34H
DATA2    DB  36H,35H,30H,38H,32H
DATA     ENDS

STACK    SEGMENT  stack'stack' ;栈段的定义
STA      DB   20  DUP(9)
TOP      EQU     LENGTH  STA
STACK    ENDS
;======================================
CODE     SEGMENT
ASSUME   CS:CODE,DS:DATA,SS:STACK,ES:DATA  ;关联相关寄存器
START:   MOV    AX,DATA  ;初始化数据寄存器
         MOV    DS,AX
         MOV    AX,STACK  ; 初始化栈段寄存器
         MOV    SS,AX  ; 初始化栈的大小
         MOV    AX, TOP
         MOV    SP,AX  

         MOV    SI,OFFSET  DATA2  ;将data2的偏移量赋给si
         MOV    BX,05
         CALL   DISPL  ; 调用displ子程序在屏幕上输出data2
         CRLF   ; 调用宏实现在屏幕上输出回车

         MOV    SI,OFFSET  DATA1 ;将data1的偏移量赋给si
         MOV    BX,05  
         CALL   DISPL  ; 调用displ子程序在屏幕上输出data2
         CRLF ; 调用宏实现在屏幕上输出回车

         MOV    DI,OFFSET  DATA2 ;将data2的偏移量赋给di
         CALL   ADDA  ;调用ADDA子程序实现data1+data2->data1
         MOV    SI,OFFSET  DATA1 ;将结果偏移量赋给si
         MOV    bX,05
         CALL   DISPL ; 调用displ子程序在屏幕上输出结果
         CRLF

         MOV    AX,4C00H
         INT    21H

DISPL    PROC   NEAR  ;向屏幕输出子程序
DS1:     MOV    AH,02 
         MOV    DL,[SI+BX-1] ;dl存放data中的某一位数据
         INT    21H  ;调用21号中断的2耗资程序向屏幕输出数据
         DEC    BX ; 共有5位数据,每次减1
         JNZ    DS1
         RET
DISPL    ENDP

ADDA     PROC   NEAR  ;实现两个多位十进制数的相加
         MOV    DX,SI ;加数偏移量
         MOV    BP,DI ;被加数偏移量
         MOV    BX,5  ;表示是5位十进制的加法

;AD1表示将加数和被加数的每位从ASCII形式转化为十进制数据
AD1:     SUB    byte  ptr [SI+BX-1],30H 
         SUB    BYTE  PTR  [DI+BX-1],30H
         DEC    BX ;记录AD1的循环次数
         JNZ    AD1
         MOV    SI,DX
         MOV    DI,BP
         MOV    CX,05 ;表示AD2的循环次数
         CLC  ;清除cf进位标志位
;实现多位十进制每位相加
AD2:     MOV    AL,[SI]
         MOV    BL,[DI]
         ADC    AL,BL
         AAA ;实现加法的调整
         MOV    [SI],AL;将加法的结果送回被加数区
         INC    SI
         INC    DI
         LOOP   AD2

         MOV    SI,DX
         MOV    DI,BP
         MOV    BX,05; 表示AD3的循环次数
;将和的十进制表达转化回ASCII形式便于输出
AD3:     ADD    BYTE  PTR  [SI+BX-1],30H
         ADD    BYTE  PTR  [DI+BX-1],30H
         DEC    BX
         JNZ    AD3
         RET
ADDA     ENDP
CODE     ENDS
END      START

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy-wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值