南京信息工程大学实验报告 实验名称 实验 4 [bx]和loop的使用 实验日期 得分
学院 计软院
专业 计算机科学与技术
年级 2017级
班次 5班 姓名 陈奕明 学号 20171308194
一、实验目的
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)
四、实验结论
1. 实验内容1
(1)源代码:
assume cs:code
code segment
mov ax, 0b800h
mov ds, ax
mov bx,07b8h
mov ax,0441h
mov cx,15
s: mov ds:[bx],ax
add bx,2
loop s
mov ah,4ch
int 21h
code ends
end
第一次实验截图:
汇编,连接生成可执行文件完成。
可执行文件执行结果如下:与老师所给样件符合
(2)将源代码程序中字数据0403H→修改为0441H,再次运行,截图显示运行结果。
数据修改后,可执行文件执行结果如上
2. 实验内容2(必做部分) (1)源代码 (2)汇编、链接无误后,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令 查看0:200~0:23F,确认是否将0~63传送至此段内存区域。这部分,要求有截图。 (选做部分,如完成,也按上述要求在博客文档中撰写相应内容)
源码如下:
assume cs:code
code segment
mov ax, 0020h
mov ds, ax
mov cx,64
mov bx,0
s: mov ds:[bx],bx
add bx,1
loop s
mov ah,4ch
int 21h
code ends
end
实验结果如上,0:200~0:23F所指的内存空间已经按照其连续顺序被赋了指定的值
3. 实验内容3
(1)源代码 :
assume cs:codesg
codesg segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,0017h
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end
(2)汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200 之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存,这部分要求有截 图,并以文字方式说明空白处填写依据。
这道题思路如下:
首先第一个空应该是填cs 因为cs寄存器指向了程序的开始处,而第二个空的话我们知道这段程序的代码长度在cx中存放(用debug来调试时)。所以我们可以先在 2 空处填上cx,即先让程序能编译链接生成对应的target.exe文件,然后用debug t5exe来对其调试,然后输入r后查看cx的值,如果不知道mov ax,4c00h 和int 21h占了多少字节,都可以通过输入u后就可以看到各条命令占了多少字节。获得了总长度之后,再用其减去mov ax,4c00h 和int 21h占用的字节,所得的结果就是(2)出所应该填写的值了。
汇编,连接,生成可执行文件。
由这里可以看到cx寄存器的值为1B,那还要减去mov ax,空间4c00h 和int 21h这两条指令的大小
由上可得,循环次数为17次,所以第二空填入为0017h
填入后重新调试代码,运行结果如下:
五、总结与体会
loop可以大大简化程序中需要重复执行的部分,提高了代码的可读性,需要在以后的学习中认真体会这一点。