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 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 ;m=8 ;被加数长度大于加数长度,即被加数大于加数 ;被加数长度等于加数长度,进行大小比较
;被加数长度小于加数长度,即被加数小于加数