实验二初级程序的编写与调试实验.docx
《实验二初级程序的编写与调试实验.docx》由会员分享,可在线阅读,更多相关《实验二初级程序的编写与调试实验.docx(17页珍藏版)》请在冰豆网上搜索。
实验二初级程序的编写与调试实验
重庆大学
学生实验报告
实验课程名称汇编语言程序设计
开课实验室DS1501
学院软件学院年级级专业班软件工程班
学生姓名学号
开课时间2014至2015学年第1学期
总成绩
教师签名
王志平
软件工程学院制
《汇编语言程序设计》实验报告(格式样本)
开课实验室:
DS1501机房2014年9月 日
学院
软件学院
年级、专业、班
13级软件工程班
姓名
成绩
课程
名称
汇编语言程序设计
实验项目
名称
实验二:
初级程序的编写与调试实验
指导教师
王志平
教师评语
教师签名:
王志平
2014年月日
一【实验目的】
1.进一步熟悉DEBUG命令;
2.掌握数据在内存中的存放方式和内存操作数的几种寻址方式,段寄存器和物理地址计算;
3.熟悉数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP;
4.掌握简单的汇编语言程序编写与调试。
二【实验环境】
PC微机;
DOS操作系统或Windows操作系统;
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境。
三【实验要求】
1.仔细阅读有关DEBUG命令的内容,对有关命令,要求事先准备好使用的例子;
2.阅读数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP的内容;
3.用DEBUG的有关命令调试本实验中的求累加和程序、多字节加法程序、数据串搬家程序段。
四【预备知识】Debug的使用
(1)什么是Debug?
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。
使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
(2)我们用到的Debug功能
●用Debug的R命令查看、改变CPU寄存器的内容;
●用Debug的D命令查看内存中的内容;
●用Debug的E命令改写内存中的内容;
●用Debug的U命令将内存中的机器指令翻译成汇编指令;
●用Debug的T命令执行一条机器指令;
●用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。
五【实验内容】
1.内存操作数及各种寻址方式使用;
2.求累加和程序;
3.多字节加法程序;
4.数据串搬家程序;
5.段寄存器概念及字符串传送指令练习。
六【实验步骤】
1.内存操作数及各种寻址方式使用
MOVAX,1234
MOV[1000],AX
MOVBX,1002
MOVBYTEPTR[BX],20
MOVDL,39
INCBX
MOV[BX],DL
DECDL
MOVSI,3
MOV[BX+SI],DL
MOV[BX+SI+1],DL
MOVWORDPTR[BX+SI+2],2846
步骤:
(1)用A命令键入上述程序,并用T命令逐条运行。
(2)每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。
注意D命令显示结果中右边的ASCII字符及双字节数存放法。
立即选址方式:
MOVAX,1234
MOVBX,1002
MOVDL,39
MOVSI,3
直接寻址方式:
MOV[1000],AX
MOVBYTEPTR[BX],20
MOV[BX],DL
基址变址寻址方式:
MOV[BX+SI],DL
MOV[BX+SI+1],DL
MOVWORDPTR[BX+SI+2],2846
2.求累加和程序:
程序:
MOVBX,1000
MOVCX,10
SUBAX,AX
LOP:
ADDAL,[BX]
ADCAH,0
INCBX
J:
LOOPLOP
INT3
步骤:
(1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替;
(2)用命令NAA将此程序命名为文件AA(文件名可任取);
(3)用R命令将BX:
CX改为程序长度值(即最后一条指令后面的地址减去开始地址;
(4)用命令W100将此程序存到AA命名的磁盘文件中;
(5)用命令Q退出DEBUG;
(6)用命令DEBUGAA再次调入DEBUG和文件AA,可用U命令检查调入程序;
(7)用E命令在内存地址1000H处键入16个数字;
(8)用命令G=100J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值;如:
G=0100010D
【说明:
G就是连续执行内存代码,可以在G后面指定内存地址如G=0000:
0100;地址可以是偏移地址,也可以是逻辑地址。
如不指定地址,G就会从指令指针ip指的内存处开始执行;G命令还可以指定执行断点,如,G=0000:
01000000:
0200就是代码从100的内存地址执行到200的内存地址然后断住。
】
(9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样,若不一样,检查程序是否有错;
(10)重复G、J与T,再检查AX是否正确;
(11)用G命令使程序运行到结束,检查AX值是否正确。
【说明:
G=100是指从偏移量:
0100开始执行,直到程序结束为止。
】
3.多字节加法程序
程序:
MOVDI,1000
MOVCX,8
MOVSI,2000
CLC
LOP:
MOVAL,[SI]
ADC[DI],AL
INCSI
INCDI
LOOPLOP
INT20
步骤:
(1)用命令键入此程序。
(2)用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。
4.数据串搬家程序
(1)用A命令键入下列程序:
MOVSI,1000
MOVDI,1500
MOVCX,0FH
LOP:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPLOP
INT20
(2)用A命令DB伪指令在1000H键入下列字符串:
‘IBM_PCCOMPUTER'
(3)用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。
【说明:
G=100是指从偏移量:
0100开始执行,直到程序结束为止。
】
5.段寄存器概念及字符串传送指令练习
(1)用A命令键入下列程序:
MOVSI,0
MOVDI,0
MOVAX,1000
MOVDS,AX
MOVAX,1500
MOVES,AX
MOVCX,0F
CLD
REPMOVSB
INT20
(2)用A命令DB伪指令在1000:
0000处键入字符串'IBM_PCCOMPUTER',并用D命检查
(3)用D命令检查0F00:
1000处内容,看是否一样。
为什么?
原因:
因为1000:
0000和0F00:
0000是同一个地址。
(4)用G命令运行此程序,检查目的地址1500:
0000处内容。
并记下DS与ES值。
【说明:
G=100是指从偏移量:
0100开始执行,直到程序结束为止。
】
此时的DS和ES的值分别为:
DS:
1000ES:
1500
(5)修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?
)仍和原来一样。
6.自编程序
用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同多字节加法程序,调试并做记录。
4字节减法程序源代码
1397:
0100MOVSI,1000
1397:
0103MOVCX,4
1397:
0106MOVDI,2000
1397:
0109CLC
1397:
010AMOVAL,[SI]
1397:
010CSBB[DI],AL
1397:
010EINCSI
1397:
010FINCDI
1397:
0110LOOP010A
1397:
0112INT20
1397:
0114
调试和运行
结果运行正确
七【实验过程原始记录(数据、图表、计算等)】
如果有则写。
八【实验结果及分析】
九【思考题】
1.MOVBYTEPTR[BX],20
MOVWORDPTR[BX+SI+2],2846
上述指令中BYTEPTR及WORDPTR伪操作不加行不行?
试一试。
2.用G命令运行多字节加法程序,并用D命令检查其结果(存放在哪里?
),是否正确?
答:
正确。
3.将多字节加法程序中的INT20H指令改为INT3,有何区别?
若这条指令不加,行不行?
试一试。
答:
改为INT3后程序可以运行,但无法正常结束。
不加指令,结果与上面一样:
4.数据串搬家程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?
修改程序以做到这一点。
答:
不能。
修改代码如下:
MOV SI,1000
MOV DI,1500
MOV CX,0FH
LOP:
MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP
MOV SI,1500
MOV DI 1002
MOV CX,0FH
LOP1:
MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP1
INT 20