實驗4:[bx]和loop的使用
實驗任務一
綜合使用 loop,[bx],編寫完整彙編程式,實現向記憶體 b800:07b8 開始的連續 16 個
字單元重複填充字資料 0403H
實現:
1.編寫原始碼檔案:test1.asm
注意點:在彙編程式中,資料不能以字母開頭。b800前要加上0。
2.編譯、連結
批處理檔案:process.bat
1 masm %1.asm; 2 link %1.obj;
3.執行
4.將原始碼程式中字資料 0403H→修改為 0441H,再次執行
實驗任務二
綜合使用 loop,[bx],編寫完整彙編源程式,實現向記憶體 0:200~0:23F 依次傳送資料
0~63(3FH)
(1)必做:綜合使用 loop, [bx], mov 實現
(2)選做*:利用棧的特性,綜合使用 loop,push 實現(限定僅使用 8086 中已學過
指令實現)
(1)實現:
①編寫原始碼:test2_.asm
②編譯、連結、執行
③除錯
可以看出,此方法是記憶體單元從0:200起依次被傳送0~63的資料
(2)實現:
①編寫原始碼:test2.asm
②編譯、連結、執行
③除錯
注意點:由於入棧操作是從高地址單元→低地址單元方向的,所以實際上是從記憶體單元0:23f處逆序傳送0~63的資料的。另外,由於入棧操作是以字為單元操作的,而這裡需要對位元組操作,採取的方法是:把一個暫存器(如BX)的高低位元組單獨賦值後再壓人棧中。
實驗任務三
下面的程式的功能是將”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
實現:
由於題目要求把程式碼段內的指令當資料複製到目的地址,而cs段暫存器中儲存的是指向程式程式碼段的段地址,因此第一空填CS;由於事先不知道整個程式佔的位元組數,可以先在第二個空預填一個合適的數(如10h),使之編譯通過,然後除錯檢視CX的值,再減5(最後2條語句的位元組數)即可得到程式從開始至“mov ax,4c00h”所佔的位元組數。
①原始碼(預填)
②編譯、除錯
CX=1C,故程式從開始至“mov ax,4c00h”所佔的位元組數為17h
③原始碼更新
④再次除錯
可以看到,cs段的第一個位元組成功的複製到了es:0;
同樣地,第二個位元組也被成功複製過去了。全部複製完成後,反彙編檢視複製過去的內容,發現與原始碼相同。