1. 程式人生 > >實驗4:[bx]和loop的使用

實驗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;

同樣地,第二個位元組也被成功複製過去了。全部複製完成後,反彙編檢視複製過去的內容,發現與原始碼相同。