当前位置:文档之家› 任意两个20位十进制数相加的例程

任意两个20位十进制数相加的例程

;*************************************************

;例5.13
;程序名称:BCDADD.ASM
;程序功能:输入两20位以内的十进制数,相加并显示和
;调用子程序:输入子程序:INPUT
; 非压缩BCD码相加求和子程序 BCDADD
; BCD码转ASCII子程序 BCD2ASC
; 字符串显示子程序 DISPLAY
;程序流程图:图5-10
;*************************************************
;回车换行宏定义
;-------------------------------------------------
LR MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
;==================================================
;堆栈段定义
;--------------------------------------------------
STACK SEGMENT STACK
DW 20 DUP(?)
STACK ENDS
;==================================================
;数据段:加数和被加数最长不超过20位
; 和最长21位
;-------------------------------------------------
DATA SEGMENT
ADD1 DB 20 DUP(?),"$"
ADD2 DB 20 DUP(?),"$"
SUM DB 21 DUP(?),"$"
STR1 DB "ADD1:","$"
STR2 DB "ADD2:","$"
DATA ENDS
;=================================================
;代码段
;-------------------------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
ASSUME ES:DATA,SS:STACK
MAIN PROC FAR
START:
PUSH DS
XOR AX,AX
PUSH AX ;将程序段前缀入栈,利用RET返回时调用INT20H,返回DOS
MOV AX,DATA
MOV DS,AX ;数据段初始化
MOV ES,AX
LEA BX,STR1
CALL DISPSTR ;调用显示子程序,显示提示输入被加数字符串
LEA BX,ADD1
CALL INPUT ;调用子程序,输入被加数
LR ;调用宏,显示回车换行符
LEA BX,STR2
CALL DISPSTR ;调用显示子程序,显示提示输入加数字符串
LEA BX,ADD2
CALL INPUT ;输入加数
LEA BX,ADD1
CALL ADDAIGN ;被加数个位对齐到高地址
LEA BX,ADD2
CALL ADDAIGN ;加数个位对齐到高地址
LEA SI,ADD1 ;被加数首址
LEA DI,ADD2 ;加数首址
LEA BX,SUM ;和首址
CALL BCDADD ;调用子程序,完成多位BCD码的加法
LEA BX,SUM
CALL BCD2ASC ;将和转为ASCII码
LR ;另起一行
LEA BX,ADD1
CALL DISPSTR ;显示被加数
MOV DL,' '
CALL DISPCHR ;显示空格“ ”
MOV DL,'+'
CALL DISPCHR ;显示加号“+”
MOV DL,' '
CALL DISPCHR ;显示空格“ ”
LEA BX,ADD2
CALL DISPSTR ;显示加数
MOV DL,' '
CALL DISPCHR ;显示空格“ ”
MOV DL,'='
CALL DISPCHR ;显示等号 “=”
MOV DL,' '
CALL DISPCHR ;显示空格“ ”
LEA BX,SUM
CALL DISPSTR ;显示和
RET
MAIN ENDP ;主程序结束
;**************************************************
;子程序名称:INPUT
;子程序功能:输入数字,遇到回车返回,最多输入20位
; 入口参数:BX为要输入缓冲区首址
; 出口参数:无
;程序流程图:图5-11
;*******************

*******************************
INPUT PROC
PUSH CX
PUSH AX
PUSHF ;保护现场
XOR CX,CX
INPUTNUM:
MOV AH,01H
INT 21H ;调用中断,输入一个字符到AL
CMP AL,0DH
JZ EXITINPUT ;遇到回车返回
CMP AL,'0'
JB INPUTNUM ;非数字重新输入
CMP AL,'9'
JA INPUTNUM ;非数字重新输入
INC CX
CMP CX,20
JA EXITINPUT ;输入到20个后退出
MOV [BX],AL ;存放输入的数字
INC BX ;调整地址指针,指向缓冲区下一个字符
JMP INPUTNUM
EXITINPUT:
MOV BYTE PTR [BX],"$" ;放一个结束标志符
POPF
POP AX
POP CX ;恢复现场
RET
INPUT ENDP
;**************************************************
;子程序名称:DISPSTR
;子程序功能:显示字符串,遇到"$"符结束
; 入口参数:BX为要显示字符串首址
; 出口参数:无
;程序流程图:图5-12
;**************************************************
DISPSTR PROC
PUSH DX ;保护现场
PUSH AX
MOV CX,21
MOV DI,BX
MOV AL,0
CLD
REPZ SCASB ;跳过0值不显示
DEC DI
MOV AL," "
REPZ SCASB
MOV DX,DI ;显示缓冲区首址
DEC DX ;调整指针,指向要显示的第一个字符
MOV AH,09H
INT 21H ;利用DOS系统功能调用显示字串
POP AX
POP DX
RET
DISPSTR ENDP
;**************************************************
;子程序名称:ADDALIGN
;子程序功能:将加数或被加数个位对齐(按最长20位处理)
; 入口参数:BX为处理的加数或被加数首址
; 出口参数:无
;程序流程图:图5-13
;**************************************************
ADDAIGN PROC
MOV DI,BX
MOV AL,"$"
MOV CX,21
CLD
REPNZ SCASB ;扫描标志符“$”的位置
PUSH CX ;当前CX值为缓冲区中空值个数
MOV SI,DI
DEC SI ;源串末地址
MOV DI,BX
ADD DI,20 ;目的串末地址
NEG CX
ADD CX,21 ;CX←21-CX,即要传送的字节数
STD ;为避免产生覆盖错误,采用减量传输
REP MOVSB ;将加数或被加数个位与高地址对齐
POP CX
MOV AL,0
MOV DI,BX
CLD
REP STOSB ;对齐后对源串清空处理
RET
ADDAIGN ENDP
;**************************************************
;子程序名称:BCDADD
;子程序功能:多位BCD码的相加求和
; 入口参数:SI为被加数首址,DI为加数首址
; BX为和首址
; 出口参数:无
;程序流程图:图5-14
;**************************************************
BCDADD PROC
ADD BX,20 ;执行和的个位
ADD SI,19 ;指向被加数个位
ADD DI,19 ;指向加数个位
CLC ;清进位标志,便于循环中使用带进位加法
MOV CX,20 ;相加次数
ADDALL:
MOV AL,[SI]
ADC AL,[DI] ;带进位加法,把低位产生的进位加到本位上
AAA ;非压缩BCD码加法,需要调整
MOV [BX],AL ;存和
DEC SI ;调整被加数地址,指向下一位
DEC DI ;调整加数地址,指向下

一位
DEC BX ;调整和地址,指向下一位
LOOP ADDALL ;把20位加完
ADC BYTE PTR[BX],0 ;若最高位有进位,利用本句存到和中
RET
BCDADD ENDP
;**************************************************
;子程序名称:BCD2ASC
;子程序功能:将BCD码转换为ASCII码
; 入口参数:BX为要转换BCD码的首址,遇“$”结束
; 出口参数:无
;程序流程图:图5-15
;**************************************************
BCD2ASC PROC
PUSH AX ;保护现场
PUSH CX
PUSH DI
MOV DI,BX
MOV AL,0
MOV CX,21
CLD
REPZ SCASB ;跳过高位的0不转换
DEC DI ;找到的非0位地址
CONV:
MOV AL,[DI]
CMP AL,"$"
JZ EXITB2A ;遇到“$”退出
AND AL,0FH
OR AL,30H ;BCD→ASCII
MOV [DI],AL ;放回ASCII码
INC DI
JMP CONV ;继续转换剩余BCD码
EXITB2A:
POP DI
POP CX
POP AX ;恢复现场
RET
BCD2ASC ENDP
;**************************************************
;子程序名称:DISPCHR
;子程序功能:显示DL中ASCII码
; 入口参数:DL中为要显示字符ASCII码
; 出口参数:无
;程序流程图:图5-16
;**************************************************
DISPCHR PROC
MOV AH,02H
INT 21H ;调用DOS中断,显示DL中字符
RET
DISPCHR ENDP
;***************************************************
CODE ENDS
END START

相关主题
文本预览
相关文档 最新文档