南京信息工程大学实验报告
实验名称 实验 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命令对程序段进行精确反汇编。