实验一 加法程序
一、实验目的:
学习数据传送和算术运算指令的用法。
二、实验内容:
将两个多位十进制28056,47193相加,并显示加数,被加数,和。要求两个加数均以ASCII码形式各自顺序存放在DATA1和DATA2内存单元中,结果送回DATA1处(低位在前,高位在后)。
三,程序流程图:
程序流程如图2.1所示。
开始 显示被加数和加数 将被加数和加数由ASCII码转化为十六进制 计数值5 CX 清除最低位进位 执行ADC带进位相AAA 调整 结果送被加数存储区 调整偏移量 N CX-1=0? Y 将十六进制的结果转化为ASCII码表示的数字串 显示结果“和” 结束 图2.1十进制数相加程序流程图
四、编写源程序如下:
SHOW MACRO B MOV DL,B MOV AH,02H INT 21H ENDM
DATA SEGMENT
DATA1 DB 33H,39H,31H,37H,34H DATA2 DB 36H,35H,30H,38H,32H DATA3 DB '____ ',0DH,0AH,'$' DATA ENDS
STACK SEGMENT STACK STA DB 20 DUP (?) TOP EQU LENGTH STA STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV SI,OFFSET DATA2 MOV BX,05 SHOW 20H CALL DISPL SHOW 0DH SHOW 0AH
MOV SI,OFFSET DATA1 MOV BX,05 SHOW 2Bh CALL DISPL SHOW 0DH SHOW 0AH MOV CL,7
S1: SHOW 2DH LOOP S1
SHOW 0DH SHOW 0AH
MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 CALL ADDA
MOV SI,OFFSET DATA1 MOV BX,05 SHOW 20H CALL DISPL MOV AX,4C00H INT 21H DISPL PROC NEAR
DS1: SHOW [SI+BX-1] DEC BX JNZ DS1 RET DISPL ENDP
ADDA PROC NEAR MOV DX,SI MOV BP,DI MOV BX,05
AD1: SUB BYTE PTR [SI+BX-1],30H SUB BYTE PTR [DI+BX-1],30H DEC BX JNZ AD1 MOV SI,DX MOV DI,BP MOV CX,05 CLC
AD2: MOV AL,[SI] MOV BL,[DI] ADC AL,BL AAA
MOV [SI],AL INC SI INC DI LOOP AD2
MOV SI,DX MOV DI,BP MOV BX,05
AD3: ADD BYTE PTR [SI+BX-1],30H ADD BYTE PTR [DI+BX-1],30H DEC BX JNZ AD3 RET ADDA ENDP CODE ENDS END START
编写完源程序后,保存为文件名为“JIAFA.ASM”的文件。 五、实验结果:
①用“ML”命令对源程序“JIAFA.ASM”进行汇编链接。由于输入代码时粗心,输入有误,编译器提示程序错误在20和21行:
②输入“EDIT JIAFA..ASM”进入编辑界面,查找20和21行,发现输入逗号“,”输入时错写成句号“.”,开始改错:
③纠正后保存,接着汇编链接,程序正确,生成可执行文件“JIAFA.EXE”:
④输入“JIAFA.EXE”执行程序,执行结果如下,符合题目要求:
六、思考题:
变成65082和39174,并且相加。
问:不改变数据段DATE1和DATE2的内容,如何将加数和被加数分别由28056和47193
答:将原程序中的数据相加顺序改变一下,即将原来的倒序相加变为顺序相加,也可将结果变为65082和39174。程序具体改动如下:
源程序 改变后的程序 DS1:SHOW [SI+BX-1] 改为 DS1: SHOW [SI]
AD2: MOV AL,[SI] 改为 AD2: MOV AL,[SI+BX-1] MOV BL,[DI] 改为 MOV BL,[DI+BX-1]
INC SI
INC DI 改为 DEC BX
ADD BYTE PRT 改为 ADD BYTE PRT [SI],30H [SI+BX-1],30H 改为 ADD BYTE PRT [DI],30H ADD BYTE PRT 改为 INC SI [DI+BX-1],30H 改为 INC DI
七、实验总结:
本次实验第一次将课本上的程序搬入机器中运行,虽然程序较长且难理解,不过在电脑上可进行“debug”调试,学起来更加得心应手。同时,编译器能提示程序的错误行,这对程序的调试提供很大的帮助。虽然自己目前还达不到自己编写出类似复杂汇编程序的水平,不过本次实验激发了我的学习热情,在接下来的学习过程中,我将更加重视上机实验这个环节,毕竟在自己笔记本上也可以做这些类似实验。
实验过程中注意保持细心、耐心,因为正确输入源程序将为接下来的工作提供很大便利,如果在输入程序时粗心大意,造成较多错误,将严重拖慢接下来的实验进度。