实验四 [BX]和loop的使用

[BX]和loop的使用

1.综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H。

源程序如图所示

img

编译连接后的运行结果

img

将line7的0403h改为0441h后的运行结果为

img

2.综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)。

必做:综合使用loop, [bx], mov实现

源程序如图所示

img

编译连接后进行追踪

img

使用d命令和g命令查看执行前后 0:200~23f的变化

img

选做*:利用栈的特性,综合使用 loop,push 实现(限定仅使用 8086 中已学过 指令实现)

源程序如图所示

img

追踪程序执行过程,使用d命令和g命令查看执行前后 0:200~23f的变化

img

3.下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。

assume cs:code  
	code segment  
		mov ax, ______  
		mov ds, ax  
		mov ax, 0020h  
		mov es, ax  
		mov bx, 0  
		mov cx, ______  
	  s:mov al, [bx]  
		mov es:[bx], al  
		inc bx  
		loop s  
		mov ax, 4c00h  
		int 21h  
		code ends  
end  

这个实验要求我们复制程序返回指令之前的指令,那么我们首先要做的就是找到程序存储的位置,由第四章4.9可知cs:ip指向程序的第一条指令,那么我们看一下这个程序,它的line4要求我们将ax的值存入到段地址ds中,而再看line9和line10,很明显,这就是将指令复制到0:200处的指令,那么ds:bx内的数据就是我们的程序,而且我们可以从cs和code得到程序的段地址,那么line3第一个空应该填cs或者code,接下来就是line8的空,cx用来控制循环的次数,但我们不知道这个程序到底有多少字节,那我们应该先随便填写一个数,编译连接后追踪程序,用r命令查看程序的总长度(cx=1c),但我们得到的字节数是包括了程序返回指令的字节数的,因此我们要减去多余的数,已知程序返回指令的字节数为5,那么我们就减去5,得到总长为17,因为这是16进制,所以我们应该填 17h.

操作过程如下图所示

img

img

img

img

img

原文地址:https://www.cnblogs.com/-Anguvia-/p/9975156.html