1. 程式人生 > 實用技巧 >PHP核心配置詳解

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, 7B8H
    
mov 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命令會顯示各個暫存器的狀況,這些顯示內容會覆蓋我們寫入的內容,或使得螢幕滾動,將我們寫入的內容滾動到可視區域外,進而被丟棄。以上是我個人的猜想,具體原因還需要更進一步的驗證。