实验四 内存块移动实验
程序员文章站
2022-03-15 14:52:43
...
一、实验要求
利用PROTEUS平台,建立8086 的内存块移动的例子。
二、实验目的
1.熟悉实验系统的编程和使用。
2.了解内存的移动方法。
3.加深对存储器读写的认识。
三、实验说明
程序要求把内存中一数据区(称为源数据块)传送到内存另一数据区(称为目的数据块)。源数据块和目的数据块在存贮中可能有三种情况,如下图所示。
对于两个数据块分离的情况,如图(a),数据的传送从据块的首址开始,或者从数据块的末址开始均可。但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出如下结论:当源数据块首址大于目的块首址时,从数据块首地址开始传送数据。当源数据块首址小于目的块首址时,从数据块末址开始传送数据。
四、实验程序流程图
五、实验步骤
a.仿真代码
CODE SEGMENT
ASSUME CS:CODE
START:
MOV SI,1000H;源内存
MOV CX,100;准备存储的字节区
MOV AL,1;初始化AL,作为被存储的数据
PU_IN: MOV [SI],AL ;先存入1000H开始的100个字节数据为1到100
INC AL ;数字加一
INC SI;指向下一个空白字节
LOOP PU_IN
MOV CX,100 ;准备移动的内存大小(字节单位)
MOV SI,1000H;源内存地址
MOV DI,1100H ;目标内存地址
FADR: MOV AL,[SI] ;将[si]的数据存入[di]
MOV [DI],AL ;由于禁止内存间数据直接传输,故需要AL作为中介
INC SI
INC DI
DEC CX ;表示已处理完一个字节
JNE FADR ;当CX=0时跳出循环
JMP $
CODE ENDS
END START
b.调试、验证
在执行第一段循环后从1000H开始的内存中存储了从1H到64H共100字节的数据。
执行了内存块移动部分的代码后发现从1100H开始的地址内存了那100字节数据,且源数据不变。这说明内存块移动实验成功
六. 实验结果和体会
以上即为实验结果。由于源内存块与目的内存块没有交集,复制顺序随意。这里采用从头开始移动数据的方法。这段程序采用了两种循环方式,一种是使用LOOP,一种是DEC CX后判断JNE。
七. 扩展题目程序和实验结果
要求:将1000H开始的10个字节转存到1005H开始的10个字节。注意内存块之间有重叠哦。
;MOV RAM:1000H开始的10个字节
;转存到 1005H开始的10个字节
CODE SEGMENT
ASSUME CS:CODE
START:
MOV SI,1000H
MOV CX,10
MOV AL,0
PU_IN:
MOV [SI],AL ;先存入1000H开始的100个字节数据为0到9H
INC AL
INC SI
LOOP PU_IN ;直到存储满10个字节到1000H那片内存
MOV CX,10
MOV SI,1009H ;源内存的尾地址
MOV DI,100EH ;目标内存的尾地址1005H+9H=100EH
FADR:
MOV AL,[SI] ;从后向前进行复制
MOV [DI],AL
DEC SI ;将SI、DI指向前一块内存
DEC DI
DEC CX
JNE FADR
JMP $
CODE ENDS
END START
实验开始前从1000H开始的内存存储着0到9共10个数据。
实验结束后可以看到从1005H开始的内存被覆盖,而出现了新的0到9共10个字节数据。