多字节加减法总汇编程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16位10进制正整数加减法汇编程序代码说明:
将代码复制到Masm for Windows 集成实验环境 2012.5软件当中保存后点击运行如图:
出现如下窗口:
在屏幕上输入被加数(被减数)按‘+’结束,然后再输入加数(减数)按‘=’结束,最后窗口会显示运算结果。例如要计算123456+123456789,步骤如下:
显然运算结果是正确的。进行减法运算:123456-123456789,结果如下:
(注:由于n=16所以本程序最多只能进行16位数以内的正整数加减运算,如需进行任意位数的运算只需对n进行更改即可,这是本程序的最大优点。但是本程序只能完成正整数的加减运算,对负数和小数的运算就无能为力了,另外也无法进行连加与连减的运算。因此程序还有待进一步的改进。)
汇编程序代码:
DATAS SEGMENT
n EQU 16 ;n表示和的最大位数
m EQU 8 ;因为和是ASCII码要转换成BCA码所以m=n/2
k EQU 9*m+6 ;
BUF0 DB 1 DUP (30H);
BUF1 DB n DUP(0) ;被加数(ASCII),n=8
DB 1 DUP (30H)
BUF2 DB n DUP(0) ;加数(ASCII)
BUF3 DB m DUP(0) ;被加数(BCD)
BUF4 DB m DUP(0) ;加数(BCD)
FHA DB 4 DUP(?) ;用于保存‘+’、‘-’、数据长度
SBC DB m DUP(?) ;BCD码形式的和
SAS DB n DUP(?) ;ASCII码形式的和
BUF5 DB 30H,n DUP(0),30H,n DUP(0),n DUP(0),4 DUP(?),m DUP(?),n DUP(?)
DATAS ENDS
STACKS SEGMENT
DB 100 DUP(?)
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
INPT1 PROC
;输入被加数到BUF1按‘+’结束
LEA SI,BUF1
MOV CX,0 ;CX用来统计输入数的字长
IN1:MOV AH, 01H
INT 21H
CMP AL,'+'
JZ BJS1
CMP AL,'-'
JZ BJS1
MOV [SI],AL
INC SI
INC CL
JMP IN1
;将BUF1中的ASCII转换成BCD码到BUF3
BJS1:
MOV [FHA],AL
MOV 1[FHA],CL
LEA DI,BUF3
MOV BX,2
MOV AX,CX
DIV BL
ADD AL,AH
MOV CL,AL
AB1: DEC SI ;AB1--ASCII转换成BCD码MOV AL,[SI]
SUB AL,30H
DEC SI
MOV AH,[SI]
SUB AH,30H
PUSH CX
MOV CL,4
SHL AH,CL
POP CX
ADD AL,AH
MOV [DI],AL
INC DI
LOOP AB1
;输入加数到BUF2按‘=’结束
LEA SI,BUF2
MOV CX,0 ;CX用来统计输入数的字长 IN2:MOV AH, 01H
INT 21H
CMP AL,'='
JZ JAS
MOV [SI],AL
INC SI
INC CX
JMP IN2
;将BUF2中的ASCII转换成BCD码到BUF4 JAS:
MOV 2[FHA],CL
LEA DI,BUF4
MOV BX,2
MOV AX,CX
DIV BL
ADD AL,AH
MOV CL,AL
AB2: DEC SI ;AB2--ASCII转换成BCD码
MOV AL,[SI]
SUB AL,30H
DEC SI
MOV AH,[SI]
SUB AH,30H
PUSH CX
MOV CL,4
SHL AH,CL
POP CX
ADD AL,AH
MOV [DI],AL
INC DI
LOOP AB2
RET
INPT1 ENDP
;加法子程序
JAF PROC
CLC
MOV CL,m ;m=8
LEA BX,BUF3
LEA SI,BUF4
LEA DI,SBC
ADC_:MOV AL,[BX]
ADC AL,[SI]
DAA
MOV [DI],AL
INC SI
INC DI
INC BX
LOOP ADC_
RET
JAF ENDP
;减法子程序
JIAF PROC
SBB_:MOV AL,1[FHA]
CMP AL,2[FHA]
JA BDJ1 ;被加数长度大于加数长度,即被加数大于加数 JZ BZJ1 ;被加数长度等于加数长度,进行大小比较
JMP BBJ ;被加数长度小于加数长度,即被加数小于加数BZJ1:MOV CL,AL ;被加数长度等于加数长度,进行大小比较LEA SI,BUF1
LEA DI,BUF2
BZJ3:MOV AL,[SI]
CMP AL,[DI]