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

匯編實驗肆 [bx]和loop的使用

pan 信息工程 改變 資料 說明 text fff 課件 調試

南京信息工程大學實驗報告

實驗名稱 實驗 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的使用