匯編實驗肆 [bx]和loop的使用
南京信息工程大學實驗報告
實驗名稱 實驗 4 [bx]和loop的使用
實驗日期 11.25
得分
學院 計軟院
專業 計科
年級 2017級
班次 6班級
姓名 江軻禹
學號 20171308227
一、實驗目的
1. 理解和掌握寄存器間接尋址方式[bx] 2. 通過匯編指令loop的使用理解編程語言中循環的本質 3. 熟練掌握使用debug按需調試完整匯編源程序的方法
二、實驗準備
1. 學習/復習第 5章使用[bx]和loop實現循環的編程應用示例(教材 5.5節,5.8節) 2. 復習第3章「棧」的知識 3. 結合第4章課件,復習完整匯編源程序編寫→匯編→連接→運行→調試的方法
三、實驗內容
1. 綜合使用 loop,[bx],編寫完整匯編程序,實現向內存 b800:07b8 開始的連續 16 個 字單元重復填充字數據0403H。 2. 綜合使用 loop,[bx],編寫完整匯編源程序,實現向內存 0:200~0:23F 依次傳送數據 0~63(3FH)。 (1)必做:綜合使用loop, [bx], mov實現 (2)選做*:利用棧的特性,綜合使用 loop,push 實現(限定僅使用 8086 中已學過 指令實現) 3. 教材實驗4(3)(P121)
提示: Tips1: 實驗內容 1 和 2 本質上是一類問題,都是把數據送到一組連續的內存單元。不 同之處僅在於,實驗內容1是將一個常數(字 .數據) ,送到指定的一組連續的字 .單元;而實 驗內容 2是將一組連續的字節 ..數據,送到指定的連續的字節 ..單元。在程序中改變偏移地址時, 要註意做不同的處理。 其中,實驗內容1如正確編寫了程序,其運行結果應當如下圖所示:
Tips2: 實驗內容 2,如果利用棧實現,借助 push和loop實現連續入棧操作。但要註意: ① 8086的入棧操作,是從高地址單元→低地址單元方向的; ② 8086的入棧操作,只能以字為單元。但這裏是字節數據,如何靈活處理? Tips3: 實驗內容 3,本質仍然是復制,只不過復制的是自身代碼。這道填空的關鍵是, 如何確定復制多少字節。 Tips4:細節問題,如十六進制/十進制、循環次數、指令合法用法及其註意事項等。
四、實驗結論
1. 實驗內容1
(1)源代碼
(2)將源代碼程序中字數據0403H→修改為0441H,再次運行,截圖顯示運行結果。
代碼:
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
實驗結果:輸入指令,經過一系列的編譯和鏈接,可以得到結果一排紅心
代碼:
assume cs:code
code segment
mov ax,0b800h
mov ds,ax
mov ax,0441h
mov bx,07b8h
mov cx,16
s:mov [bx],ax
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
實驗結果:將mov ax,0403h改為mov ax,0441h,經過一系列的編譯和鏈接,可以得到結果一排紅色大寫A
分析: 04應該是控制紅色的字符,對應地03控制的是紅心,41控制的是紅色大寫A;
2. 實驗內容2(必做部分)
(1)源代碼
(2)匯編、連結無誤後,靈活使用 debug 的 t 命令、g 命令、p 命令調試,用 d 命令 查看0:200~0:23F,確認是否將0~63傳送至此段內存區域。這部分,要求有截圖。
(選做部分,如完成,也按上述要求在博客文檔中撰寫相應內容)
代碼:
assume cs:code
code segment
mov ax,0h
mov ds,ax
mov cx,63
mov bx,200h
mov ax,0
s:mov [bx],ax
add ax,1
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
實驗結果:輸入指令,經過一系列的編譯和鏈接,執行後,卻沒有任何輸出
分析:利用debug環境進行調試:
(1)在debug中運行loop2.exe檔並查看當前各個寄存器中的值;
(2)利用u命令對076a:0 001a進行精確反匯編;
(3)利用g命令執行到mov ax,4c00h之前;
(4)利用t命令單部執行;碰到int改用p命令
屏幕上最後輸出Programe terminated?normally
為什麽會輸出Programe?terminated?normally?通過查閱相關資料,了解到,這是因為在指令中沒有設置斷點,或設置的斷點程序在執行中未能到達斷點處,這時程序將一直運行,直到結束。
利用g命令執行到int 21h之前,得到以下結果:
由此說明,寄存器cx的值沒有發生任何改變
3. 實驗內容3
(1)源代碼
(2)匯編連接後,靈活使用debug的t命令、g命令、p命令調試,用d命令查看0:200 之後的若幹字節,觀察是否將mov ax, 4c00h之前的指令復制到指定內存,這部分要求有截 圖,並以文字方式說明空白處填寫依據。
根據實驗任務2,進行反匯編可以得知"mov ax,4c00h"之前的機器碼的存儲位置是076a:0~076a:0014,現在需要將之前的指令復制到內存0:200處,只需要將076a:0~076a:0014這段內存中的機器碼復制到一0:200開始的內存空間即可。
(1)當前偏移地址為076a,所以將數據傳入段寄存器CS中;
(2)由於此段內存空間有14個字節單元,所以執行14次循環;
代碼:
assume cs:code
code segment
mov ax,076ah
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,14
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
實驗結果:輸入指令,經過一系列的編譯和鏈接,執行後,輸出Required parameter missing。。。(缺少必要參數)?
分析:輸出Required parameter missing 的原因是什麽?
利用debug環境進行調試
運行copy.exe並查看當前各個寄存器的值並利用u命令進行精確反匯編
利用g命令執行到mov ax,4c00之前
利用t命令和p命令執行
最後用d命令查看0:200之後的內容;
可以看出我們已經將數據存入了0:200開始的內存
五、總結與體會
1)了解了loop和[bx]的使用,利用 [bx]和loop可以直接進行循環,方便了很多。
2)靈活使用debug命令查看寄存器的值和u命令對程序段進行精確反匯編。
匯編實驗肆 [bx]和loop的使用