接口技术实验四、加减运算实验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39071593/article/details/83691248

一、实验目的
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.程序流程图如图所示。
在这里插入图片描述

先讲一下我的思路,其实是后来想的,感觉还行,就是代码多一些,150多行,当然也可以用循环缩短一丢丢把。

是这样的
在这里插入图片描述
当然不能少了进位比如实验中的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

结果

在这里插入图片描述

其他结果

在这里插入图片描述
在这里插入图片描述
看来没问题了

猜你喜欢

转载自blog.csdn.net/qq_39071593/article/details/83691248