1. 程式人生 > >組合語言程式設計實驗報告四

組合語言程式設計實驗報告四

南京資訊工程大學實驗報告 實驗名稱 實驗 4 [bx]和loop的使用 實驗日期 得分

學院 計軟院

專業 電腦科學與技術

年級 2017級

班次 5班 姓名 陳奕明 學號 20171308194 


一、實驗目的


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)


四、實驗結論
1. 實驗內容1

(1)原始碼:

assume cs:code
code segment

mov ax, 0b800h
mov ds, ax

mov bx,07b8h
mov ax,0441h

mov cx,15

s: mov ds:[bx],ax
add bx,2
loop s

mov ah,4ch
int 21h
code ends
end

第一次實驗截圖:

彙編,連線生成可執行檔案完成。

可執行檔案執行結果如下:與老師所給樣件符合

(2)將原始碼程式中字資料0403H→修改為0441H,再次執行,截圖顯示執行結果。 

資料修改後,可執行檔案執行結果如上


2. 實驗內容2(必做部分) (1)原始碼 (2)彙編、連結無誤後,靈活使用 debug 的 t 命令、g 命令、p 命令除錯,用 d 命令 檢視0:200~0:23F,確認是否將0~63傳送至此段記憶體區域。這部分,要求有截圖。 (選做部分,如完成,也按上述要求在部落格文件中撰寫相應內容)

原始碼如下:

assume cs:code
code segment

mov ax, 0020h
mov ds, ax

mov cx,64
mov bx,0

s: mov ds:[bx],bx
add bx,1
loop s

mov ah,4ch
int 21h
code ends
end


實驗結果如上,0:200~0:23F所指的記憶體空間已經按照其連續順序被賦了指定的值
3. 實驗內容3

(1)原始碼 :

assume cs:codesg
codesg segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,0017h
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end


(2)彙編連線後,靈活使用debug的t命令、g命令、p命令除錯,用d命令檢視0:200 之後的若干位元組,觀察是否將mov ax, 4c00h之前的指令複製到指定記憶體,這部分要求有截 圖,並以文字方式說明空白處填寫依據。

 

這道題思路如下:

首先第一個空應該是填cs 因為cs暫存器指向了程式的開始處,而第二個空的話我們知道這段程式的程式碼長度在cx中存放(用debug來除錯時)。所以我們可以先在 2 空處填上cx,即先讓程式能編譯連結生成對應的target.exe檔案,然後用debug t5exe來對其除錯,然後輸入r後檢視cx的值,如果不知道mov ax,4c00h 和int 21h佔了多少位元組,都可以通過輸入u後就可以看到各條命令佔了多少位元組。獲得了總長度之後,再用其減去mov ax,4c00h 和int 21h佔用的位元組,所得的結果就是(2)出所應該填寫的值了。

 

彙編,連線,生成可執行檔案。

由這裡可以看到cx暫存器的值為1B,那還要減去mov ax,空間4c00h 和int 21h這兩條指令的大小

由上可得,迴圈次數為17次,所以第二空填入為0017h

填入後重新除錯程式碼,執行結果如下:

 

 

 

 

 

五、總結與體會
loop可以大大簡化程式中需要重複執行的部分,提高了程式碼的可讀性,需要在以後的學習中認真體會這一點。