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

Posted wwangzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验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

首先用edit编辑ex1.asm文件:

技术图片

然后使用masm命令进行汇编(没有打;所以要多打几个回车):

技术图片

使用link进行连接,得到可执行文件:

技术图片

查看生成文件:

技术图片

 运行ex1.exe,看到输出了4个图案:

技术图片

接下来使用debug命令调试,首先查看到CX寄存器的值为0031,说明机器码有48个字节,所以使用u命令对076A:0000 0030进行反汇编(一般字节数为CX-1)。

技术图片

从上面可以看到DS=075A ,CS=076A=DS+10H,而这中间的10H(256字节)就是PSP,是DOS用来和程序进行通信的。所以ds:0 ff中间的内容就是PSP,而CS:0指向程序的第一条指令。DS存放的是程序段地址,由于PSP的存在,真正要执行的地址是DS再加上256个字节,真正的地址是DS*16+256化简一下:DS*16+0+16*16=16*(DS+16)真正的地址又可以写成:cs*16+0.

下面就使用-d ds:0 ff来进行查看,以CD开头,证明是PSP。

技术图片

使用g命令调试,首先使用g命令到mov  AH,4C之前,然后用t单步调试,最后使用p调试int 21,结束程序.

技术图片

2. 实验任务2

首先用edit编辑ex2.asm文件:

技术图片

然后使用masm命令进行汇编,使用link进行连接,得到可执行文件,并且执行文件,显示出符号:

技术图片

 

接下来使用debug命令调试,首先查看到CX寄存器的值为001C,说明机器码有001Bh个字节。

技术图片

所以使用u命令对076A:0000 001B进行反汇编(一般字节数为CX-1)。

技术图片

用g命令调试,首先使用g命令到mov  AH,4C之前,然后用t单步调试,最后使用p调试int 21,结束程序.

一开始调试根本没有显示图标,应该是和屏幕的滚动有关系,cls后单独进行执行就有结果了,下面将mov cx, 4 改成 mov cx, 8后的显示因为多反汇编了一步导致在单步调试的时候屏幕发生滚动,导致小图标的消失.

技术图片

将ex2.asm中的mov cx, 4 改成 mov cx, 8;然后后重新编译,链接,生成可执行文件并运行:

技术图片

技术图片

技术图片

明显看出来这次运行出来的小图标有8个,比修改前多了4个,而这正好对应着loop多循环了4次后,将增加了0101H的AX放入到下一个内容单元.

总结:ex1和ex2,他们实现的功能是相同的,都是将0101H的倍数(依次递增)存入到DS(B810H),因为是修改的显存的内容,所以会在屏幕上显示出图案;在具体实现上,ex1是直接寻址方式,ex2是间接寻址方式.

3. 实验任务3 
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。根据题目要求,编辑ex3.asm文件:
技术图片
运行结果如下:

 技术图片

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

 根据实验结果,分析得到这个字数据中高位字节里存放的是颜色,低位字节里存放的是字符ASCLL码,37H是7  39H是9。

4. 实验任务4
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
综合使用[bx]和loop,编写汇编源程序,灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。
编辑ex4.asm代码如下:
技术图片

编译之后使用debug查看各种寄存器的状态,并且使用u精准反汇编得到结果如下:

 技术图片

使用g命令直接完成循环,然后使用d 0:200 23F命令查看内容,存储内容正确,然后完成调试.

 技术图片

5. 实验任务5
教材实验4(3)(P121)
技术图片

使用u命令精准反汇编:

 技术图片

 g命令调试到loop s之前:

技术图片

 p命令调试:

技术图片

分别查看0:200内存里面存储的和指令内容,验证是一样的,赋值成功.

技术图片

空白处填写依据:
因为是将代码段的内容赋值,都是从存储器中取,所以首先将cs里的值通过ax送给ds寄存器,表明是传送的代码段的字节位置,而后面的es则是内存0:200,所以第一个空填入cs寄存器的值。
第二空首先随便填入一个数字,使用debug用u命令反汇编后可知mov ax,4c00h前面是076A:0017,所以之前的代码段是0-16h,一共17h,所以第二空填17h。

实验总结

(1)能够熟练掌握出使用masm、link工具汇编、链接的命令行并查看运行结果的方法。

(2)了解t命令 p命令和g命令的使用区别。t命令是单步调试,p命令是遇到loop指令执行到loop指令结束的位置,g命令是执行到指定的行位置,我是习惯使用g命令直接到mov ax,4c00h之前然后再t命令和p命令来结束调试。

(3)关于实验1和2,在调试过程中没有显示,个人觉得应该是和屏幕滚动有关,当行数不足以滚动屏幕时,继续t命令,小图标是不会消失的,但是当屏幕滚动时,小图标就消失了。

 


 

 


 

 

 

 




以上是关于实验2 汇编源程序编写与汇编调试的主要内容,如果未能解决你的问题,请参考以下文章

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

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

实验2 多个逻辑段的汇编源程序编写与调试

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

实验2 多个逻辑段的汇编源程序编写与调试

实验3 多个段的汇编源程序编写与调试