南京信息工程大学实验报告 实验名称 实验 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可以大大简化程序中需要重复执行的部分,提高了代码的可读性,需要在以后的学习中认真体会这一点。
原文:https://www.cnblogs.com/cymwn-com/p/10018172.html