汇编实验报告分析解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福建农林大学金山学院实验报告
系:信息与机电工程专业:电子信息工程年级: 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 SEGMENT
MSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6
M DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV AL, 0
LEA SI, MSG
L1: MOV BL, [SI]
CMP BL, 0
JBE NEXT
INC AL
NEXT: INC SI
LOOP L1
MOV M, AL
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
2.数据段中是一组无符号数,将最小数存放在M单元中。
按上题方法查找一处逻辑错误。
DSEG SEGMENT
MSG DB 13, 15, 7, 25, 24
M DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV CX, 4
MOV AL, MSG
MOV SI, OFFSET MSG+1
L1: CMP AL, [SI]
JB NEXT
MOV AL, [SI]
NEXT: LOOP L1
MOV M, AL
MOV AL, 0
INT 21H
CSEG ENDS
END START
3.编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。
4.编程:
∑
-
=
* =
8
1
i
i
i
B
A
Y
,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 SEGMENT
BUF DB 4, -2, -6, 0, 5, 0, 8, 0, 5, 6
RESULT DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV CX, 10
MOV AL, 0
LEA SI, BUF
L1: MOV BL, [SI]
CMP BL, 0
JNZ NEXT
INC AL
NEXT: INC SI
LOOP L1
MOV RESULT, AL
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END 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 SEGMENT
NUM1 DB 4, 2, 6, 5, 8, 3, 6
NUM2 DB 5, 9, 8, 4, 2, 3, 7
REST DW ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV CX, 7
MOV AL, 0
MOV DX, 0
LEA SI, NUM1
LEA DI, NUM2
L1: MOV BL, [SI]
MOV AL, [DI]
MUL BL
ADD DX, AX
INC SI
INC DI
NEXT: LOOP L1
MOV REST,DX
MOV AH, 4CH
INT 21H
CSEG ENDS
END 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等指令的应用等。