1. 程式人生 > 實用技巧 >linux kernel swap

linux kernel swap

一、實驗目的

1. 理解並掌握彙編源程式組成與結構 2. 掌握組合語言源程式編寫→彙編→連結→除錯的工具和方法 3. 理解彙編源程式中地址表示、段暫存器的用法 4. 理解和掌握暫存器間接定址方式[bx] 5. 通過彙編指令loop的使用理解程式語言中迴圈的本質

二、實驗準備

1. 學習/複習第5章使用[bx]和loop實現迴圈的程式設計應用示例(教材5.5節,5.8節) 2. 複習第3章「棧」的知識 3. 結合第4章課件,複習完整彙編源程式編寫→彙編→連線→執行→除錯的方法 4. 複習8086彙編中記憶體單元地址的表示,以及段暫存器DS, SS, ES, CS的用途

三、實驗結論

1.實驗任務1

(1)給出ex1.asm原始碼:

 1 ;ex1.asm
 2 assume cs:code 
 3 code segment 
 4     mov ax, 0b810h 
 5     mov ds, ax 
 6     mov byte ptr ds:[0], 1 
 7     mov byte ptr ds:[1], 1 
 8     mov byte ptr ds:[2], 2 
 9     mov byte ptr ds:[3], 2 
10     mov byte ptr ds:[4], 3 
11     mov byte ptr ds:[5], 3 
12     mov
byte ptr ds:[6], 4 13 mov byte ptr ds:[7], 4 14 mov ah, 4ch 15 int 21h 16 code ends 17 end

(2)給出使用masm、link工具彙編、連結的命令列及執行結果截圖

(3) 給出使用debug除錯的截圖

1)檢視PSP的命令

2)使用u命令精確進行反彙編

3)使用g命令執行到line16退出執行之前

2.實驗任務2

(1) 給出ex2.asm原始碼

 1 ; ex2.asm 
 2 assume cs:code 
 3 code segment 
 4     mov
ax, 0b810h 5 mov ds, ax 6 mov bx, 0 7 mov ax, 101H 8 mov cx, 4 9 s: mov [bx], ax 10 add bx, 2 11 add ax, 101H 12 loop s 13 mov ah, 4ch 14 int 21h 15 code ends 16 end

(2)給出使用masm、link工具彙編、連結的命令列及結果截圖

(3)使用debug除錯

1)使用u命令精確進行反彙編

2)靈活使用t命令、p命令、g命令,對ex2.exe進行除錯

3)把ex2.asm中line9 mov cx,4改成 mov cx,8, 儲存後重新彙編、連結、執行並觀察結果。

(4)回答問題:

ex2.asm和ex1.asm實現相同的功能,都出現了相同的圖案。(修改後的ex2.asm,實現的圖案不同.)

ex2.asm使用了loop迴圈,而ex1.asm沒有。

3.實驗任務3

(1)給出ex3.asm原始碼

 1 ;ex3.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0b800h
 5     mov ds,ax
 6     mov bx,07b8h
 7     mov ax,0237h
 8     mov cx,16
 9 s:  mov [bx],ax
10     add bx,2
11     loop s
12     mov ah,4ch
13     int 21h
14 code ends
15 end

(2)給出執行結果截圖

(3)基於以下實驗操作的發現和文字說明。

1)把填充的字資料,從0237H改成0239H,再次儲存後,彙編、連結、執行,觀察結果。

2)把填充的字資料,從0237H改成0437H,再次儲存後,彙編、連結、執行,觀察結果。

3)猜測與分析,這個字資料中高位位元組裡存放的是什麼資訊,低位位元組裡存放的是什麼資訊。

第一次高位位元組不變,改變低位位元組,結果顯示顏色不變,顯示的內容改變;

第二次改變高位位元組,低位位元組不變,結果顯示顏色改變,顯示的內容不變。

可知,高位位元組裡存放的是顏色資訊,低位位元組裡存放的是內容資訊。

4.實驗任務4

(1)綜合使用[bx]和loop,給出ex4.asm原始碼

 1 ;ex4.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0h
 5     mov ds,ax
 6     mov bx,0200h
 7     mov cx,40h
 8 s:  mov [bx],ax
 9     add bx,1h
10     add ax,1h
11     loop s
12     mov ah,4ch
13     int 21h
14 code ends
15 end

(2)彙編、連結無誤後,靈活使用debug的t命令、g命令、p命令除錯,用d命令檢視0:200~0:23F,確認是否將0~63傳送至此段記憶體區域。

5.實驗任務5

下面的程式的功能是將“mov ax,4c00h”之前的指令複製到記憶體0:200處。

(1)填空ex5.asm原始碼

 1 ; ex5.asm
 2 assume cs:code
 3 code segment
 4     mov ax, cs
 5     mov ds, ax
 6     mov ax, 0020H
 7     mov es, ax
 8     mov bx, 0
 9     mov cx, 0017H
10     s: mov al, [bx]
11     mov es:[bx], al
12     inc bx
13     loop s
14     mov ax, 4c00H
15     int 21h
16 code ends
17 end

(2)彙編連線後,靈活使用debug的t命令、g命令、p命令除錯,用d命令檢視0:200之後的若干位元組,觀察是否將mov ax,4c00h之前的指令複製到指定記憶體。

mov ax,4c00h之前的指令複製到指定記憶體。

填寫依據:

1.根據題目要求是複製彙編指令,到指定記憶體,所以應將彙編語句的儲存段地址cs給ds。

2.loop指令的迴圈中每次複製一個位元組的資料,先隨便填入cx值,debug時進入利用r命令檢視程式所佔位元組數,然後可知cx的值為17。

四、實驗總結

1.在除錯過程中,遇到不知道p命令和t命令區別的問題,通過查閱可知p命令類似t命令,不過遇到子程式呼叫的時候直接執行完子程式程式碼,不會進入子程式逐條執行。在遇到迴圈指令時,會直接執行到CX=0。

2.通過本次的實驗,自己動手操作完成,能夠熟悉並掌握完整彙編源程式編寫→彙編→連線→執行→除錯的方法。