标签:数据 分享 内存区域 寻址方式 本质 .com 源代码 image 依据
20171308171 胡欣怡
一、实验目的
1. 理解和掌握寄存器间接寻址方式[bx]
2. 通过汇编指令 loop 的使用理解编程语言中循环的本质
3. 熟练掌握使用 debug 按需调试完整汇编源程序的方法
二、实验准备
1. 学习/复习第 5 章使用[bx]和 loop 实现循环的编程应用示例(教材 5.5 节,5.8 节)
2. 复习第 3 章「栈」的知识
3. 结合第 4 章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法
三、实验内容
1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个
字单元重复填充字数据 0403H。
2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据
0~63(3FH)。
(1)必做:综合使用 loop, [bx], mov 实现
(2)选做*:利用栈的特性,综合使用 loop,push 实现(限定仅使用 8086 中已学过
指令实现)
3. 教材实验 4(3)(P121)
提示:
Tips1: 实验内容 1 和 2 本质上是一类问题,都是把数据送到一组连续的内存单元。不
同之处仅在于,实验内容 1 是将一个常数(字.数据),送到指定的一组连续的字.单元;而实
验内容 2 是将一组连续的字节..数据,送到指定的连续的字节..单元。在程序中改变偏移地址时,
要注意做不同的处理。
其中,实验内容 1 如正确编写了程序,其运行结果应当如下图所示:
Tips2: 实验内容 2,如果利用栈实现,借助 push 和 loop 实现连续入栈操作。但要注意:
① 8086 的入栈操作,是从高地址单元→低地址单元方向的;
② 8086 的入栈操作,只能以字为单元。但这里是字节数据,如何灵活处理?
Tips3: 实验内容 3,本质仍然是复制,只不过复制的是自身代码。这道填空的关键是,
如何确定复制多少字节。
Tips4:细节问题,如十六进制/十进制、循环次数、指令合法用法及其注意事项等。
四、实验结论
此部分书写内容:
1. 实验内容 1
(1)源代码
(2)将源代码程序中字数据 0403H→修改为 0441H,再次运行,截图显示运行结果。
源程序为0403h
经过编译和连接
清屏之后编译得到结果为一排红心
将源代码程序中字数据0403H→修改为0441H
更改之后的程序
经过汇编和连接之后得到的结果
最后的结果由红心变成了红A
2. 实验内容 2(必做部分)
(1)源代码
(2)汇编、链接无误后,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令
查看 0:200~0:23F,确认是否将 0~63 传送至此段内存区域。这部分,要求有截图。
(选做部分,如完成,也按上述要求在博客文档中撰写相应内容)
源程序如上
汇编连接后
使用d命令查看结果
遇到循环使用g命令
最后使用d命令再次查看
3. 实验内容 3
(1)源代码
(2)汇编连接后,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令查看 0:200
之后的若干字节,观察是否将 mov ax, 4c00h 之前的指令复制到指定内存,这部分要求有截
图,并以文字方式说明空白处填写依据。
书上的源程序经填空
经过编译连接确认
使用r命令显示寄存器状态,显示整个程序代码所占字节数。这里我们发现CX= 001CH。
使用u命令显示汇编指令,求出需要复制的机器码字节数。
我们发现mov ax,4cooH/int 21H它们共占用了5个字节。所以在本实验中我们需要复制的代码字节数是001CH-0005H=0017H==23个字节,故cx计数寄存器赋值为23或17H。
所以正确的程序是这样的
经过汇编和连接
对其进行反汇编
使用t命令遇到循环就是用g命令
查看0:200的内容
对0:200的内容进行反汇编发现已经成功复制
总结与体会
首先,指令全部都是二进制表示。其次,cs:ip表示cpu执行指令的地址。所以,只要mov ax,cs 就能把该程序在内存里的首地址mov到ax了。
标签:数据 分享 内存区域 寻址方式 本质 .com 源代码 image 依据
原文地址:https://www.cnblogs.com/jinevol/p/10017453.html