福建农林大学金山学院实验报告系:信息与机电工程专业:电子信息工程年级: 2013 班级: 3班姓名:单瑞学号: 136710101 实验课程:汇编语言实验室号:金综B705实验时间:2015/6/12指导教师签字:刘永芬成绩:实验三分支循环程序设计1.实验目的和要求1、学习调试程序,查找逻辑错误;2、学习分支语句的编程和调试;3、学习循环语句的编程和调试。
2.实验环境实验的硬件环境是:IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。
3.实验内容及实验数据记录1.有10个数,统计正数的个数,存放在变量M中中。
经过汇编后,形成EXE文件。
在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发现结果不正确。
用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄存器中值的变化是否正确。
(AL寄存器中存放正数的个数)DSEG SEGMENTMSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6M DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV AL, 0LEA SI, MSGL1: MOV BL, [SI]CMP BL, 0JBE NEXTINC ALNEXT: INC SILOOP L1MOV M, ALMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START2.数据段中是一组无符号数,将最小数存放在M单元中。
按上题方法查找一处逻辑错误。
DSEG SEGMENTMSG DB 13, 15, 7, 25, 24M DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 4MOV AL, MSGMOV SI, OFFSET MSG+1L1: CMP AL, [SI]JB NEXTMOV AL, [SI]NEXT: LOOP L1MOV M, ALMOV AL, 0INT 21HCSEG ENDSEND START3.编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。
4.编程:∑-=* =81iiiBAY,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。
4.算法描述及实验步骤1.操作步骤:(1)编写源程序,并命名为1.ASM保存到D盘m文件夹中;(2)在DOS状态下,进入MASM目录;(3)输入命令:MASM 1.ASM;(4)在系统出现的提示中输入:object filename[.obj]:按回车键;source listling[nul.lst]:输入:1;cross-reference [nul.crf]:按回车键;(5)系统没有提示错误,汇编完成,产生.obj文件;(6)输入:LINK 1.OBJ;run file [.exe]:按回车键。
list file [nul.map]:按回车键。
libraries [.lib]:按回车键。
(7)没有提示错误,汇编过程结束,产生.EXE可执行文件;(8)输入DEBUG 1.EXE;使用G命令执行程序。
使用D命令查看M单元的内容。
使用T命令查看分步执行过程并找出错误原因。
使用Q命令退出DEBUG。
(9)修改程序并保存。
(10)重复上述1至8步。
2.操作步骤:(1)编写源程序,并命名为2.ASM保存到D盘m文件夹中;(2)在DOS状态下,进入MASM目录;(3)输入命令:MASM 2.ASM;(4)在系统出现的提示中输入:object filename[.obj]:按回车键;source listling[nul.lst]:输入:2;cross-reference [nul.crf]:按回车键;(5)系统没有提示错误,汇编完成,产生.obj文件;(6)输入:LINK 2.OBJ;run file [.exe]:按回车键。
list file [nul.map]:按回车键。
libraries [.lib]:按回车键。
(7)没有提示错误,汇编过程结束,产生.EXE可执行文件;(8)输入DEBUG 2.EXE;使用G命令执行程序。
使用D命令查看M单元的内容。
使用T命令查看分步执行过程并找出错误原因。
使用Q命令退出DEBUG。
(9)修改程序并保存。
(10)重复上述1至8步。
3.程序算法:DSEG SEGMENTBUF DB 4, -2, -6, 0, 5, 0, 8, 0, 5, 6RESULT DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 10MOV AL, 0LEA SI, BUFL1: MOV BL, [SI]CMP BL, 0JNZ NEXTINC ALNEXT: INC SILOOP L1MOV RESULT, ALMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START操作步骤:(1)编写源程序,并命名为3.ASM保存到D盘m文件夹中;(2)在DOS状态下,进入MASM目录;(3)输入命令:MASM 3.ASM;(4)在系统出现的提示中输入:object filename[.obj]:按回车键;source listling[nul.lst]:输入:3;cross-reference [nul.crf]:按回车键;(5)系统没有提示错误,汇编完成,产生.obj文件;(6)输入:LINK 3.OBJ;run file [.exe]:按回车键。
list file [nul.map]:按回车键。
libraries [.lib]:按回车键。
(7)没有提示错误,汇编过程结束,产生.EXE可执行文件;(8)输入DEBUG 3.EXE;使用G命令执行程序。
使用U命令查看程序执行过程。
使用D命令查看RESULT单元的内容。
使用Q命令退出DEBUG。
4 .程序算法:DSEG SEGMENTNUM1 DB 4, 2, 6, 5, 8, 3, 6NUM2 DB 5, 9, 8, 4, 2, 3, 7REST DW ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 7MOV AL, 0MOV DX, 0LEA SI, NUM1LEA DI, NUM2L1: MOV BL, [SI]MOV AL, [DI]MUL BLADD DX, AXINC SIINC DINEXT: LOOP L1MOV REST,DXMOV AH, 4CHINT 21HCSEG ENDSEND START实验步骤:(1)编写源程序,并命名为4.ASM保存到D盘m文件夹中;(2)在DOS状态下,进入MASM目录;(3)输入命令:MASM 4.ASM;(4)在系统出现的提示中输入:object filename[.obj]:按回车键;source listling[nul.lst]:输入:4;cross-reference [nul.crf]:按回车键;(5)系统没有提示错误,汇编完成,产生.obj文件;(6)输入:LINK 4.OBJ;run file [.exe]:按回车键。
list file [nul.map]:按回车键。
libraries [.lib]:按回车键。
(7)没有提示错误,汇编过程结束,产生.EXE可执行文件;(8)输入DEBUG 4.EXE;使用G命令查看执行程序。
使用U命令查看程序执行过程。
使用D命令查看REST单元的内容。
使用Q命令退出DEBUG。
5.调试过程1.无错误。
2.无错误。
3.无错误4.将REST拼写成了RSET导致错误。
6.实验结果1.从下面截图可以看见:原来的程序执行后,M的值为9,结果出错。
因为原程序中JBE为无符号数的跳转指令,从下面截图中可以看出,当负数的补码存在寄存器中时,直接与0比较大小,AL的值加1,导致错误将程序中的JBE改为JLE后,从下面的截图中看出M中的值为6,结果正确。
2.从下面截图中可以看出,原来的程序执行后,M中的值为13,结果出错。
从下面截图中可以看出:整个循环语句中没有将SI移动的语句,所有循环语句全部是13与13比较,导致结果出错,将NEXT后面 LOOP L1前面加上一句INC SI即可。
修改后的程序执行后,M中的值为7,结果正确。
3.从下面的截图可以看出当BUF单元中的数为 4,-2,-6,0,5,0,8,0,5,6时,RESULT单元中的结果为3。
4.从下面的截图可以看出,当NUM1中的数值为4,2,6,5,8,3, 6,NUM2中的数值为5,9,8,4,2,3,7时,REST单元中的结果为173.7. 总结从此次实验中学会了调试程序,查找逻辑错误;学会了分支语句的编程和调试;学会了循环语句的编程和调试;学会了LOOP、JB、JBE、JNZ、INC等指令的应用等。