8086匯編指令編碼和調試
實驗任務2
-
在debug中,使用D命令加上起始地址進行生產日期的查找,實驗截圖如下:
-
然后用E命令對生產時期所在的內存單元內容進行修改,修改后再用D命令進行查看
實驗結論
最終並不能修改生產時期所在的內存單元,其值仍為最初值不變,這是由於日期所在內存單元的存儲權限為只讀,故不能進行修改。
實驗任務3
-
在debug中,使用e命令,從b800:0開始的內存單元開始,依次寫入十六進制數據04 03,重復寫5次,實驗代碼及效果截圖如下:
-
使用f命令,向內存單元區間b800:0f00 ~ b800:0f9f的連續160個字節依次重復填充十六進制數據03 04,實驗代碼及效果截圖如下:
-
其他關於修改內存地址或數據的嘗試代碼及截圖如下:
實驗任務4
-
在debug中按順序錄入代碼,內容如下圖:
-
填空
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 執行后,寄存器(sp) = 2e
push [2] ; 執行后,寄存器(sp) = 2c
push [4] ; 執行后,寄存器(sp) = 2a
push [6] ; 執行后,寄存器(sp) = 28
pop [6] ; 執行后,寄存器(sp) = 2a
pop [4] ; 執行后,寄存器(sp) = 2c
pop [2] ; 執行后,寄存器(sp) = 2e
pop [0] ; 執行后,寄存器(sp) = 30
-
回答問題
-
指令mov ss,ax和mov sp,30執行后,棧頂的邏輯地址為0020:0030H,物理地址為00230H。
-
單步調試到匯編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 查看此
時棧空間數據,實驗截圖如下:
-
匯編指令 pop [0] 執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據,發現並無變化,實驗截圖如下:
-
把最后四條指令的順序更改,最終代碼如下圖:
pop [6] 指令執行結束后,使用d命令 d 20:0 7查看此時數據空間內的數據,發現數據有變化,實驗截圖如下:
-
實驗任務5
-
實踐內容如下圖:
-
觀察並思考
-
問題1:單步執行完mov ss,ax之后指令並沒有暫停,后面那條指令也是隨即立即執行了。debug的單步調試是一種中斷,但由於CPU在執行期間不響應中斷請求,所以debug顯示的是CPU執行完棧段和棧頂指針分配后的情況。
-
問題2:08 01是偏移地址,3F 07是程序段地址,因為在單步調試,所以存在中斷,需要暫存程序現在的入口。
-
實驗任務6
-
用任意一款編輯器編寫8086匯編程序源碼如下:
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
-
對程序匯編鏈接截圖(需注意在鏈接時需通過設置將生成可執行文件指定為task5),如下圖:
-
對task6.asm生成的可執行文件task5.exe運行及結果截圖:
-
使用d命令,查看task5.exe的程序段前綴,觀察這256個字節的內容如下圖,並成功驗證前兩個字節是CD 20
實驗任務7
- 補全代碼如下:
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,要將寄存器cs中的內容賦值給ax,然后再存入段地址ds;其次,先賦值給cx進行debug,r命令得到cx是21h,故cx=21h-5h=17h。
-
補全程序后生成可執行文件task7如下圖:
繼續在debug中調試,使用g命令將程序執行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令對0:200h開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。如下圖:
實驗總結
- 實驗需要細心,在審題及編寫代碼及運行測試時需要踏實的一步一步操作,才能事半功倍
- 書本知識有限,我自己掌握的也不夠牢固,以后需要多通過書籍、網絡等途徑強化鞏固知識並擴展知識面,才能做好每一次實驗
- 這次實驗也鞏固了之前所學,對復習與鞏固有積極作用