實驗任務2
PC機主板上的ROM中有一個生產時期,在內存FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時期,並試圖修改它。
實驗步驟
在debug中,使用d命令查看生產日期
使用e命令修改生產時期所在的內存單元,修改后,再次使用d命令查看
實驗結果
實驗結論
通過debug模式下的d命令,可以找到生產日期存儲在內存單元FFF0:00F0到00FF之間,接着使用-e命令嘗試對其進行修改后發現該內存單元的值並沒有改變。因為該部分內存是ROM內存,即ReadOnly Memory,是不可進行覆寫的內存單元,是受到保護的。
實驗任務3
實驗步驟
在debug中,使用e命令,向內存單元填寫數據。
-e b800:0 03 04 03 04 03 04 03 04 03 04
從b800:0開始的內存單元開始,依次寫入十六進制數據04 03,重復寫5次。
在debug中,使用f命令,向內存單元批量填寫數據。
-f b800:0f00 0f9f 03 04
把內存單元區間b800:0f00 ~ b800:0f9f連續160個字節,依次重復填充十六進制數據03 04。
實驗結果
實驗結論
內存區域b800:0~b800:0FFF是顯存區域,修改此處的值可以直接在窗口中看到輸出。
而03,04分別是字符的ASCII碼值和顏色參數,修改可以看到不同的輸出,如:
實驗任務4
已知內存單元00201H ~ 00207H分別存放數據(如下圖所示),00220H ~ 0022fH用作棧空間。
在debug環境中,按順序錄入以下內容,單步跟蹤調試,觀察寄存器和內存空間00200H~00207H,以及,棧空間00220 ~ 0022fH內容變化情況。記錄實驗結果。回答問題,驗證和你的理論分析結果是否一致。
實驗步驟
(1) 單步執行,在執行push指令和pop指令時,觀察並記錄棧頂偏移地址的寄存器sp值的變化情況。
(2) push [6] 指令執行結束后, pop [6] 指令執行結束前,使用d命令 d 20:20 2f 查看此時棧空間的數據。
(3) pop [0] 指令執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據是否有變化。
(4) 如果把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據是否有變化。
點擊查看代碼
-e 20:0 10 20 30 40 50 60 70 80
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 執行后,寄存器(sp) = 002E
push [2] ; 執行后,寄存器(sp) = 002C
push [4] ; 執行后,寄存器(sp) = 002A
push [6] ; 執行后,寄存器(sp) = 0028
pop [6] ; 執行后,寄存器(sp) = 002A
pop [4] ; 執行后,寄存器(sp) = 002C
pop [2] ; 執行后,寄存器(sp) = 002E
pop [0] ; 執行后,寄存器(sp) = 0030
實驗結果
(1,2,3)
(4)
實驗結論
填空:
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 執行后,寄存器(sp) = 002E
push [2] ; 執行后,寄存器(sp) = 002C
push [4] ; 執行后,寄存器(sp) = 002A
push [6] ; 執行后,寄存器(sp) = 0028
pop [6] ; 執行后,寄存器(sp) = 002A
pop [4] ; 執行后,寄存器(sp) = 002C
pop [2] ; 執行后,寄存器(sp) = 002E
pop [0] ; 執行后,寄存器(sp) = 0030
問題回答:
1.
邏輯地址:20:30
物理地址:00230H
2,3,4. 見上方實驗結果
實驗任務5
在debug環境中,實踐以下內容。
實驗步驟
先使用f命令,把00220H ~ 0022fH區間的16個字節內存單元值全部修改為0。並使用d命令查看確認。
然后,使用a命令、r命令、t命令寫入匯編指令並單步調試。
實驗結果
實驗結論
問題回答:
1.
對寄存器ss賦值之后cpu不會相應中斷,會直接跳到下一步執行,故指令 mov ss, ax 單步執行完成后,后一條指令 mov sp, 30 會馬上執行。
2.
通過對00220到0022f所分配的棧內存空間的觀察,可以看到數據壓棧的過程(初始棧頂為00230)
實驗任務6
使用任何一款文本編輯器,編寫8086匯編程序源碼。
task6.asm
assume cs:code
code segment
start:
mov cx, 10
mov dl, '0'
s: mov ah, 2
int 21h
add dl, 1
loop s
mov ah, 4ch
int 21h
code ends
end start
實驗步驟
使用masm、link,匯編、鏈接,得到可執行文件task5.exe。運行程序。結合程序運行結果,理解程序
功能。
使用debug工具,調試task5.exe。根據第4章所學知識,任何可執行程序在執行時,都有一個引導程序
負責將其加載到內存,並將CPU控制權移交給它,也即將CS:IP指向可執行程序中第一條機器指令。在加
載可執行程序時,可執行前面512字節是程序段前綴PSP(Program Segment Prefix),用於記錄程序一些
相關信息。
在debug中,使用d命令,查看task5.exe的程序段前綴,觀察這256個字節的內容,驗證前兩個字節是
否是CD 20。
實驗結果
實驗結論
編譯連接的過程十分清楚
實驗任務7
下面程序的功能是,完成自身代碼的自我復制:把mov ax, 4c00h 之前的指令復制到內存0:200開始的
連續的內存單元。
補全程序,並在debug中調試驗證,確認是否正確實現了復制要求。
task7.asm
assume cs:code
code segment
mov ax, __
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, __
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
實驗步驟
(1) 補全程序。說明這樣填寫的依據。
(2) 在debug中調試,使用g命令將程序執行到loop s 之后、mov ax, 4c00h 之前,然后,使用u命令
對0:200h開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。
實驗結果
對task7.exe進行debug
補全后程序如下
assume cs:code
code 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
code ends
end
再編譯連接
然后再通過g和u命令,確認是否復制到目標空間
實驗結論
因為要復制程序指令,將程序段初始地址賦值給數據段,故第一個空填cs。
可以看到成功復制到了目標空間。
實驗總結
由於匯編編寫程序是直接對內存進行操作,可以節省很多存儲空間和運行時間。但是程序編寫時邏輯復雜,以及匯編語言的16進制不符合我們常用的習慣。