多字节加减法汇编程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]

JA BDJ1 ;被加数当前位大于加数当前位即被加数大于加数跳转JB BBJ ;被加数当前位小于加数当前位即被加数小于加数跳转INC SI ;被加数当前位等于加数当前位,调整指针继续比较

INC DI

LOOP BZJ3

JMP BDJ1 ;被加数等于加数

BBJ:MOV AH,02H

MOV DL,'-'

INT 21H

CLC

MOV CL,m

LEA BX,BUF4

LEA SI,BUF3

LEA DI,SBC

JMP BDJ

BDJ1:CLC

MOV CL,m

LEA BX,BUF3

LEA SI,BUF4

LEA DI,SBC

BDJ:MOV AL,[BX]

SBB AL,[SI]

DAS

MOV [DI],AL

INC SI

INC BX

INC DI

LOOP BDJ

RET

JIAF ENDP

;BCD码转ASCII码子程序

BCD_ASC PROC

MOV CX,m ;m=8

LEA SI,SBC

LEA DI,SAS

BC_as:MOV AL,[SI]

MOV AH,AL

AND AL,0FH

相关文档
最新文档