ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-11-01 20:33:19  阅读:166  来源: 互联网

标签:汇编 mov 源程序 命令 使用 DS 调试


一、实验目的

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命令,小图标是不会消失的,但是当屏幕滚动时,小图标就消失了。

 


 

 


 

 

 

 

标签:汇编,mov,源程序,命令,使用,DS,调试
来源: https://www.cnblogs.com/wwangzz/p/13902256.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有