一、实验目的
1.学习并掌握数据传送指令和算术运算指令的用法。
2.熟悉在PC机上建立、汇编、链接和运行8086汇编语言程序的过程。
二、实验内容
将两个多位十进制数相加,并在屏幕上显示加数、被加数以及和。己知被加数和加数均以ASCII码形式存放在DATA1和DATA2为首的单元中(低位位于低地址),结果送回DATAl处。
如:
DATA1 DB ‘2’,‘1’,‘4’,‘3’ ;两个两位十进制被加数以ASCII码保存
DATA2 DB ‘6’,‘5’,‘8’,‘7’ ;两个两位十进制加数以ASCII码保存
结果在屏幕上打印出:
12+56=68
34+78=112
结果为
三、编程提示
1.因被加数和加数均以ASCII码形式存放,所以在相加前必须转化为BCD码,此时用未组合BCD码最适宜。未组合BCD码相加要用到AAA加法调整指令。
2.显示数据可用2号DOS功能调用。
3.程序流程图如图所示。
是这样的
当然不能少了进位比如实验中的34+78=112,我弄了一个跳转,一旦出现第三位,用JNZ不跳转输出‘1’再输出后两位的结果‘12’
DATAS SEGMENT
;此处输入数据段代码
DATA1 DB '2','1','4','3'
DATA2 DB '6','5','8','7'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,0002H
LEA SI,DATA1
MOV SI,OFFSET DATA1
LEA DI,DATA2
MOV DI,OFFSET DATA2
;第一行开始
MOV AX,[SI+1] ;取1
MOV AH,02H ;输出1
MOV DL,AL
INT 21H
MOV AX,[SI] ;取2
MOV AH,02H ;输出2
MOV DL,AL
INT 21H
MOV AH,02H ;第一个'+'
MOV DL,'+'
INT 21H
MOV AX,[DI+1] ;取5
MOV AH,02H ;输出5
MOV DL,AL
INT 21H
MOV AX,[DI] ;取6
MOV AH,02H ;输出6
MOV DL,AL
INT 21H
MOV AH,02H ;第一个'='
MOV DL,'='
INT 21H
MOV AX,[SI] ;取2
SUB AX,30H
MOV BX,[DI] ;取6
SUB BX,30H
ADD AL,BL
AAA
ADD AX,30H
MOV [SI],AX ;将结果'6'存在DATA1[0]
MOV AX,[SI+1] ;取1
SUB AX,30H
MOV BX,[DI+1] ;取5
SUB BX,30H
ADD AL,BL
AAA
JNC NC0 ;判断是否进位,若没进位就跳转NC0处
ADD AX,30H
MOV [SI+1],AX ;将结果'8'存在DATA1[1]
MOV AH,02H
MOV DL,'1' ;用来输出第三位,没有进位就不输出,当然前面已经跳转了
INT 21H
MOV AH,02H
MOV DL,[SI+1] ;先输出6
INT 21H
MOV DL,[SI] ;后输出8
INT 21H
JMP L ;有的进位的情况,第一行输出完
NC0:
ADD AX,30H
MOV [SI+1],AX
MOV AH,02H
MOV DL,[SI+1]
INT 21H
MOV DL,[SI]
INT 21H
JMP L ;没进位的情况,第一行输出完
;注意第二个同样道理,只是最后跳转到结束程序,应该没人会注意吧
L:INC SI ;SI,DI分别自增两次
INC DI
LOOP L
;第一行结束
MOV AH,02H
MOV DL,0DH ;回车
INT 21H
MOV AH,02H
MOV DL,0AH ;换行
INT 21H
;第二行开始
MOV AX,[SI+1] ;取3
MOV AH,02H ;输出3
MOV DL,AL
INT 21H
MOV AX,[SI] ;取4
MOV AH,02H ;输出4
MOV DL,AL
INT 21H
MOV AH,02H ;第二个'+'
MOV DL,'+'
INT 21H
MOV AX,[DI+1] ;取7
MOV AH,02H ;输出7
MOV DL,AL
INT 21H
MOV AX,[DI] ;取8
MOV AH,02H ;输出8
MOV DL,AL
INT 21H
MOV AH,02H ;第二个'='
MOV DL,'='
INT 21H
MOV AX,[SI] ;取4
SUB AX,30H
MOV BX,[DI] ;取8
SUB BX,30H
ADD AL,BL
AAA
ADD AX,30H
MOV [SI],AX
MOV AX,[SI+1] ;取3 其实是取4,因为之前进位1,3+1=4
SUB AX,30H
MOV BX,[DI+1] ;取7
SUB BX,30H
ADD AL,BL
AAA
JNC NC1;CF!=0跳转
ADD AX,30H
MOV [SI+1],AX
MOV AH,02H
MOV DL,'1'
INT 21H
MOV AH,02H
MOV DL,[SI+1]
INT 21H
MOV DL,[SI]
INT 21H
JMP DOC
NC1:
ADD AX,30H
MOV [SI+1],AX
MOV AH,02H
MOV DL,[SI+1]
INT 21H
MOV DL,[SI]
INT 21H
JMP DOC
DOC:MOV AH,4CH
INT 21H
CODES ENDS
END START