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

實驗 4 [bx]和loop的使用

一、實驗結論

1.實驗內容1

綜合使用 loop,[bx],編寫完整彙編程式,實現向記憶體 b800:07b8 開始的連續 16 個 字單元重複填充字資料0403H。

(1)程式碼如下:

assume cs:code
code segment      mov ax,0b800h
     mov ds,ax
     mov ax,0403h
     mov bx,07b8h
     mov cx,16
s:mov [bx],ax
  inc bx
  inc bx
  loop s
  mov ax,4c00h
  int 21h
 
code ends
end (2)用masm進行執行,執行結果如下

(3)將原始碼程式中字資料0403H→修改為0441H,再次執行

 

 

2.實驗內容2

 綜合使用 loop,[bx],編寫完整彙編源程式,實現向記憶體 0:200~0:23F 依次傳送資料 0~63(3FH)

(1)

程式碼如下:綜合使用loop, [bx], mov實現

assume cs:code

code segment      mov ax,0020h
     mov ds,ax
     mov bx,0h
     mov cx,40h      mov ax,0
s:   mov [bx],ax   add ax,1h
  inc bx
  loop s
  mov ax,4c00h
  int 21h
 
code ends
end

 利用masm整合操作軟體進行編譯

用debug檢視儲存單元,觀察是否成功寫入

執行時沒有出現結果,用debug檢視記憶體單元發現,正常寫入記憶體資料,程式碼執行成功

(2)利用棧的特性,綜合使用 loop,push 實現

程式碼如下:

assume cs:code
code segment
     mov ax,0020h
     mov ss,ax
     mov sp,40h
     mov bh,3fh
     mov bl,3eh
     mov cx,20h
s:push bx
  add bh,-2
  add bl,-2
    loop s
  mov ax,4c00H
  int 21H
code ends
end

改動過程中出現的問題:

①由於8086cpu的棧讀入按字(兩個位元組輸入)所以入棧操作需要進入一個字的資料,然後把其中的兩個位元組資料分別減少2

②小端法的輸入,push bx時(bx=bh+bl),將bh放到棧最底部,bl在bh的記憶體單元上面(例如bh的地址為10002H,bl的地址為10001H)

所以要注意bh,bl的初始數值

③由於按字讀入的原則,cx=40h/2=20h。

對比兩種方法,迴圈語句顯然更容易讓人理解,而用棧語句進行操作,操作效率更高,能一次輸入兩個位元組。

 3.實驗內容3

原始碼

assume cs:code

         code segment

         mov ax,cs  因為cs為儲存指令的段地址

         mov ds,ax

         mov ax,0020H

         mov es,ax

         mov bx,0

         mov cx,0017H  此處為程式碼的長度,用debug觀察暫存器內容獲得(cx=001c,減去後面的5個不計入其中的位元組)

         s:mov al,[bx]

           mov es:[bx],al

           inc bx

           loop s

           mov ax,4c00H

           int 21H

code ends

end

用debug進行除錯

用u命令反彙編

可以看到,相應的程式碼內容已經複製到了0:200處,成功

 二、總結與體會:

①熟悉了loop和【bx】的應用,瞭解了迴圈語句的應用方法

②瞭解了棧入棧時的每個位元組輸入的先後順序,對小端法的印象更深刻了

③熟悉瞭如何進行程式碼段的複製,cs和暫存器:【bx】的應用