码迷,mamicode.com
首页 > 其他好文 > 详细

汇编实验肆 [bx]和loop的使用

时间:2018-11-25 22:29:59      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:内存区域   5.5   一个   文字   ram   编写   间接   ccf   bsp   

南京信息工程大学实验报告

实验名称   实验 4 [bx]和loop的使用  

实验日期      11.25            

得分          

学院   计软院  

专业   计科

年级   2017级   

班次   6班级

姓名   江轲禹        

学号   20171308227         

一、实验目的

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,再次运行,截图显示运行结果。

代码:

assume cs:code

code segment

    mov ax,0b800h

    mov ds,ax

    mov ax,0403h

    mov bx,07b8h

    mov cx,16

      s:mov [bx],ax

    inc bx

    inc bx

    loop s

    mov ax,4c00h

    int 21h

code ends

end

实验结果:输入指令,经过一系列的编译和链接,可以得到结果一排红心

 技术分享图片

 

代码:

assume cs:code

code segment

    mov ax,0b800h

    mov ds,ax

    mov ax,0441h

    mov bx,07b8h

    mov cx,16

      s:mov [bx],ax

    inc bx

    inc bx

    loop s

    mov ax,4c00h

    int 21h

code ends

end

 

实验结果:将mov ax,0403h改为mov ax,0441h,经过一系列的编译和链接,可以得到结果一排红色大写A

 技术分享图片

 

分析: 04应该是控制红色的字符,对应地03控制的是红心,41控制的是红色大写A;

 

 

2. 实验内容2(必做部分)

(1)源代码

(2)汇编、连结无误后,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令 查看0:200~0:23F,确认是否将0~63传送至此段内存区域。这部分,要求有截图。

(选做部分,如完成,也按上述要求在博客文档中撰写相应内容)

 

代码:

assume cs:code

code segment

mov ax,0h

mov ds,ax

mov cx,63

mov bx,200h

mov ax,0

s:mov [bx],ax

add ax,1

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

实验结果:输入指令,经过一系列的编译和链接,执行后,却没有任何输出

技术分享图片

 

分析:利用debug环境进行调试:

(1)在debug中运行loop2.exe档并查看当前各个寄存器中的值;

 技术分享图片

 

(2)利用u命令对076a:0 001a进行精确反汇编;

 技术分享图片

 

(3)利用g命令执行到mov ax,4c00h之前;

 技术分享图片

 

(4)利用t命令单部执行;碰到int改用p命令

 技术分享图片

 

屏幕上最后输出Programe terminated?normally

为什么会输出Programe?terminated?normally?通过查阅相关资料,了解到,这是因为在指令中没有设置断点,或设置的断点程序在执行中未能到达断点处,这时程序将一直运行,直到结束。

 

利用g命令执行到int 21h之前,得到以下结果:

 技术分享图片

由此说明,寄存器cx的值没有发生任何改变

 

3. 实验内容3

(1)源代码

(2)汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200 之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存,这部分要求有截 图,并以文字方式说明空白处填写依据。

 根据实验任务2,进行反汇编可以得知"mov ax,4c00h"之前的机器码的存储位置是076a:0~076a:0014,现在需要将之前的指令复制到内存0:200处,只需要将076a:0~076a:0014这段内存中的机器码复制到一0:200开始的内存空间即可。

(1)当前偏移地址为076a,所以将数据传入段寄存器CS中;

(2)由于此段内存空间有14个字节单元,所以执行14次循环;

代码:

assume cs:code

code segment

    mov ax,076ah

    mov ds,ax

    mov ax,0020h

    mov es,ax

    mov bx,0

    mov cx,14

      s:mov al,[bx]

    mov es:[bx],al

    inc bx

    loop s

    mov ax,4c00h

    int 21h

code ends

end

实验结果:输入指令,经过一系列的编译和链接,执行后,输出Required parameter missing。。。(缺少必要参数)

 技术分享图片

 

分析:输出Required parameter missing 的原因是什么?

利用debug环境进行调试

运行copy.exe并查看当前各个寄存器的值并利用u命令进行精确反汇编

 技术分享图片

 

利用g命令执行到mov ax,4c00之前

 技术分享图片

 

利用t命令和p命令执行

 技术分享图片

 

最后用d命令查看0:200之后的内容;

 技术分享图片

 

可以看出我们已经将数据存入了0:200开始的内存

 

五、总结与体会

1)了解了loop和[bx]的使用,利用 [bx]和loop可以直接进行循环,方便了很多。

2)灵活使用debug命令查看寄存器的值和u命令对程序段进行精确反汇编。

汇编实验肆 [bx]和loop的使用

标签:内存区域   5.5   一个   文字   ram   编写   间接   ccf   bsp   

原文地址:https://www.cnblogs.com/jiangkeyu/p/10017433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!