两个多位十进制数相加的实验
将两个多位十进制数相加,要求被加数和加数均以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
运行结果: