實驗 4 [bx]和loop的使用
一、實驗結論
1.實驗內容1
綜合使用 loop,[bx],編寫完整彙編程式,實現向記憶體 b800:07b8 開始的連續 16 個 字單元重複填充字資料0403H。
(1)程式碼如下:
assume cs:codecode 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,0020hmov 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】的應用