實驗一 8066彙編指令編碼和除錯
2.實驗任務二
(1)在debug中,使用d命令檢視生產日期
日期為01/01/92
(2)使用e命令修改生產時期所在的記憶體單元,修改後,再次使用d命令檢視
可以看出日期無法修改,在8086CPU中,C0000~FFFFF用於各類ROM空間,寫入資料操作是無效的,這相當於改寫只讀儲存器的內容。
3.實驗任務三
(1)在debug中,使用e命令,向記憶體單元填寫資料。
-e b800:0 03 04 03 04 03 04 03 04 03 04 從b800:0開始的記憶體單元開始,依次寫入十六進位制資料04 03,重複寫5次。
(2)在debug中,使用f命令,向記憶體單元批量填寫資料。
-f b800:0f00 0f9f 03 04
把記憶體單元區間b800:0f00 ~ b800:0f9f
地址改變,觀察結果
左上角的圖案因為地址的改變而發生了變化,不同的資料控制著不同的顏色和樣式,不同的地址控制著不同的位置。
4.實驗任務四
根據在debug環境中除錯觀察結果,填空並回答問題。
填空
002EH002CH002AH0028H002AH002CH002EH0030H
問題1:題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax 和 mov sp, 30 執行後,
棧頂的邏輯地址和實體地址分別是?
邏輯地址0020:0030;實體地址00230H
問題2:單步除錯到彙編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 檢視此時棧空間資料,給出實驗截圖。
問題3:彙編指令 pop [0] 執行結束後, pop [0] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。給出實驗截圖。
問題4:如果把最後四條指令改成截圖中的順序, pop [6] 指令執行結束後,使用d命令 d 20:0 7檢視此時資料空間內的資料是否有變化。給出實驗截圖。
5. 實驗任務5
回答問題1和問題2。
(1)問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?
是暫停了,使用t命令只會執行一條命令。再次使用t命令,mov sp 30將會執行。
(2)問題2:根據彙編指令,前三條指令執行後,
程式碼執行,程式碼的偏移地址會發生變化;0108->010B->010C->010F->0110
資料入棧,棧頂指標不斷向下移,棧偏移地址不斷變化;30->2E->2C
6. 實驗任務6
(1)給出程式原始碼
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
(2)給出使用masm、link對程式彙編連結過程截圖,以及,執行可執行程式task6.exe的執行結果截圖
(3)給出在debug中檢視task6.exe的程式段字首PSP的截圖。
7. 實驗任務7
(1)給出補全後的完整原始碼。說明程式中兩個空填寫的依據。
assume cs:code code segment mov ax, _cx____ 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
第一個空:ds的值就是程式段的段地址cs,
第二個空:cx的含義是迴圈次數,程式的執行方式是每次只複製一個位元組,因此迴圈的次數即為程式的長度cx,,17
(2)在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命令對0:200開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體空間。
(3)給出使用g命令執行到指定點和使用u命令反彙編0:200到複製程式碼長度這一段記憶體空間的截圖。