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

一、实验目的
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

dos运行edit并输入要求的内容:

dos运行masm:

生成了ex1.obj文件:

dos运行link:

产生了exe文件:

先使用debug ex1.exed命令查看前256个字节:

使用u命令精准反汇编:

使用g命令到程序结束之前的位置:

 使用d命令查看:

发现结果不对于是回去单步调试了一下:

ds的值非常奇怪,询问了老师之后可能是dosbox运行环境的缓冲区页数问题。

直接运行exe文件可以得到彩色符号:

2. 实验任务2 

跟任务一相同,先使用dosboxedit功能进行输入ex2.asm:

接着生成objexe文件:

 

u命令精确反汇编:

使用g命令直接跳到循环的前面进行t命令的单步执行:

 

此时为循环一次,cx4变为3,接着还会一直执行下去直到cx变为0.

如果使用p命令的话:

发现直接跳过了其中的循环步骤,cx4变为0AX也变为0505循环了4次。

在之后的中断指令int位置也是相同:

如果使用t命令则会进入中断指令内部:

 

使用p命令则会直接看到中断指令结束,程序中止:

继续使用edit命令将cx的值由4变为8即将循环次数从4变成8

 

重新进行编译和连接:

 

进行debug查看有何不同:

 使用p命令单步调试:

发现这次结束的时候AX0909CX8变为了0,循环了8

ex1

ex2:

ex1ex2都完成显存的图案输出,ex1使用的是将数直接填充进对应位置,而ex2则用loop循环将数值存入显存中。

3. 实验任务3 

首先根据题目所给的要求编写一个源程序:

接着按照惯例的编译连接:

 

cls命令清屏观察:

 

 发现出现了问题,仔细看了一遍题目发现是16字单元不是字节单元,在cx应该循环16次,修改一下:

 

 正确!

把填充的字数据从0237H改成0239H:

 

把填充的字数据,从0237H 改成0437H:

 

由此可以合理猜测,这个子数据中高位字节存放的是颜色信息,低位字节存放的是字节信息

4. 实验任务4
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。

 

进行编译连接并使用t,g,p命令调试:

 

 完成了数据的传送

5. 实验任务5 
首先随便给ax和cx一个数值

进行编译连接debug:

题目要求的将mov 4C00之前的指令复制而此指令在0018h的位置即将0000-0017h的指令复制到内存0:200处

所以cx的数值就应该设为17h,赋给ds的ax值的初始应该设为cs值076A

修改ex5:

 

 

 可以看到指令成功传送到了0:200内存处!

 四、实验总结

 之前汇编语言课上对于汇编源程序的一系列生成操作听的云里雾里,这次实验的5个实验任务让我完完全全理解

 了源程序的生成过程和操作步骤,对于bx和loop循环理解也更加的透彻,切勿注意在跳出loop循环时和int 21h

 结束程序时单步调试要用p命令否则会进入下一轮的loop循环和进入结束程序无法跳出。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-11-03 23:36  Sabertooth  阅读(230)  评论(3)    收藏  举报