一、實驗要求
利用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個字節數據。