PHP核心配置詳解
實驗2
一、實驗結論
1、實驗任務1
原始碼如下:
1 assume cs:code 2 code segment 3 mov ax, 0b810h 4 mov ds, ax 5 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 15 mov ah, 4ch 16 int 21h 17 code ends 18 end
彙編結果如下圖:
連結結果如下圖:
執行結果如下圖:
使用u命令精確反彙編如下圖:
檢視PSP如下圖:
使用g命令執行到退出前如下圖:
2、實驗任務2
原始碼如下:
assume cs:code code segment mov ax, 0b810h mov ds, ax mov bx, 0 mov ax, 101H mov cx, 4 s: mov[bx], ax add bx, 2 add ax, 101H loop s mov ah,4ch int 21h code ends end
彙編結果如下圖:
連結結果如下圖:
執行結果如下圖:
使用debug除錯如下圖:
ex2與ex1實現的功能是相同的,但ex2通過迴圈命令loop的使用,避免了ex1中的重複操作,使得程式更簡潔、易讀。
3、實驗任務3
原始碼如下:
assume cs:code code segment mov ax, 0b800h mov ds, ax mov bx, 7B8Hmov ax, 437H mov cx, 16 s: mov [bx], ax add bx, 2 loop s mov ah,4ch int 21h code ends end
執行結果如下圖:
將填充的資料改為0239H後執行結果如下圖:
將填充的資料改為0437H後執行結果如下圖:
根據實驗結果可以猜測,高位位元組存放的是色彩資訊,地位位元組存放的是需要顯示的字元。
4、實驗任務4
原始碼如下:
; ex2.asm assume cs:code code segment mov ax, 0 mov ds, ax mov bx, 200H mov ax, 0 mov cx, 40H s: mov [bx], ax add ax, 1 add bx, 1 loop s mov ah,4ch int 21h code ends end
彙編與連結結果如下圖:
使用u命令精確反彙編後,使用g命令執行到退出前,並使用d命令檢視0:200至0:23F,可見成功寫入,如下圖:
5、實驗任務5
最終原始碼如下:
assume cs:code code segment mov ax, cs mov ds, ax mov ax, 0020H mov es, ax mov bx, 0 mov cx, 17H s: mov al, [bx] mov es:[bx],al inc bx loop s mov ax, 4c00H int 21H code ends end
由於程式已CS:IP為入口,因此第一空處填cs。
迴圈次數即為程式碼段長度,因此可先在第二空處填入任意數字,然後彙編、連結,並通過觀察cx暫存器的值使用u命令反彙編,如下圖:
可見,需要複製的範圍為076A:0000至076A:0016,共17H個位元組。故第二空處填17H。
再次彙編、連結後,執行結果如下圖,可見成功完成了複製:
二、實驗總結
在進行實驗任務1、實驗任務2,即修改視訊記憶體時,會發現出現以下現象:直接執行程式可以觀察到螢幕上的顯示出現變化,而使用t命令單步執行時則觀察不到,且使用d命令檢視視訊記憶體區的結果也與預期不符。我認為這是由於dosbox中dos系統預設執行在虛擬顯示卡的字元模式下,視訊記憶體中的每一個單元對應螢幕上的每一個字元。debug的t命令會顯示各個暫存器的狀況,這些顯示內容會覆蓋我們寫入的內容,或使得螢幕滾動,將我們寫入的內容滾動到可視區域外,進而被丟棄。以上是我個人的猜想,具體原因還需要更進一步的驗證。