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 movbyte 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 movax, 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.通過本次的實驗,自己動手操作完成,能夠熟悉並掌握完整彙編源程式編寫→彙編→連線→執行→除錯的方法。