实验2 汇编源程序编写与汇编、调试

一、实验目的

1. 理解并掌握汇编源程序组成与结构
2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法
3. 理解汇编源程序中地址表示、段寄存器的用法
4. 理解和掌握寄存器间接寻址方式[bx]
5. 通过汇编指令loop的使用理解编程语言中循环的本质 
 
二、实验准备
1. 学习/复习第5章使用[bx]和loop实现循环的编程应用示例(教材5.5节,5.8节)
2. 复习第3章「栈」的知识
3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法
4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途
三、实验内容
1. 实验任务1
使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:

要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使用debug工具调试可执行文件。

使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
使用debug工具对程序进行调试
使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。
结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。
2. 实验任务2
使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下: 

要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使用debug工具调试可执行文件。

使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。
使用debug工具对程序进行调试。
结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编
灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同? 
3. 实验任务3
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据
0237H。
要求:
编写汇编源程序
给出运行结果截图
如程序编写正确,预期结果如图所示。(运行前先使用 cls 命令清屏,更便于观察运行结果) 

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。 

 4. 实验任务4

编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
综合使用[bx]和loop,编写汇编源程序
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看
0:200~0:23F,确认是否将0~3F传送至此段内存区域。
Tips:
这道练习,本质上就是把一组连续的字节数据(常数),送到指定的连续的字节单元。
如果利用栈实现,借助push和loop实现连续入栈操作。需要注意:
① 初始时ss和sp的设置
② 8086的入栈操作,是从高地址单元→低地址单元方向的;
③ 8086的入栈操作,只能以字为单元。但这里是字节数据,如何灵活处理? 
5. 实验任务5
教材实验4(3)(P121)
Tips:
这道练习,本质仍然是复制,只不过复制的是自身代码。填空的关键是,如何确定复制多少字节。 
四、实验结论                                                                                                   
1.实验任务1
ex1.asm源代码:
 
使用masm汇编:
 
使用link链接:
使用debug调试:
-u(使用u命令进行反汇编):
-d(查看PSP):
-g:
2.实验任务2
ex2.asm源代码:
 
使用masm汇编:
使用link链接:
使用debug调试:
-u(使用u命令反汇编)
-t/-p:
-g:
说明:ex1.exe和ex2.exe的执行结果如下图所示:
ex1:
ex2:
由此可以看出ex1.asm和ex2.asm它们实现的是相同的功能和效果,只是在具体功能实现上两个实验代码有所出入,ex1.asm是用基本的一步一步重复运算,而ex2.asm使用了循环loop,从一定程度上,ex2.asm减少了时间和空间复杂度,代码运行效率高,适用性强。
3.实验任务3
ex3.asm源代码:
运行结果:
把0237H改成0239H后的运行结果:
把0237H改成0437H后的运行结果:
说明:通过运行结果可以明显看出,当仅改变高位字节存放的信息时,输出字符的颜色发生改变,当仅改变低位字节存放的信息时,输出字符的形状发生改变,故猜测这个字数据中高位字节里存放的是控制字符颜色变化的信息,低位字节里存放的是控制字符形状的信息。
4.实验任务4
ex4.asm源代码:
使用debug命令调试:
-t/-p:
-d(查看0:200-0:23F,确认是否将0-63传送至此段内存区域)
5.实验任务5         
填空以后的源代码ex5.asm:
 
使用debug命令进行调试:
-t/-p:
-d(查看0:200之后的若干字节)
说明:mov ax,4c00h之前程序都保存在CS寄存器中,默认CS:0000所以是将CS:0000-CS:XXXX的内容保存在0:200处;CS中代码段的长度即为Mov AX,4C00H之前的代码所占代码段的长度,总共需要1ch字节,不用赋值的代码一共5h字节,所以赋值的代码为17h字节。
五、实验总结                                                                                                   
通过上机实验,将课堂所学知识应用于实践中,加深了对知识的巩固程度,更好的优化对实验代码的编写能力,通过优化代码来提高代码的效率,可行性和适用性。
 
 
posted @ 2020-11-01 16:47  LS8029  阅读(172)  评论(3)    收藏  举报