實驗一 8086匯編指令編碼和調試


  • 實驗任務1

          略

  • 實驗任務2

 

          PC機主板上的ROM中有一個生產時期,在內存FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時 期,並試圖修改它。

 1. 在debug中,使用d命令查看生產日期

  2.使用e命令修改生產時期所在的內存單元,修改后,再次使用d命令查看

  結論:並沒有產生改變,因為改寫ROM中存儲的數據是無效的,且在dosbox下的生產日期也不是真實的日期,是虛擬主板的日期。

 

  • 實驗任務3

 1、 在debug中,使用e命令,向內存單元填寫數據

-e b800:0 03 04 03 04 03 04 03 04 03 04

 

  2、在debug中,使用f命令,向內存單元批量填寫數據

-f b800:0f00 0f9f 03 04

 

3、  嘗試修改內存數據

       從b810為起始地址開始寫入數據,在右上角出現小圖標。

  • 實驗任務4

已知內存單元00201H ~ 00207H分別存放數據,00220H ~ 0022fH用作棧空間。

在debug環境中,按順序錄入以下內容,單步跟蹤調試,觀察寄存器和內存空間00200H~00207H,以及,棧空間00220 ~ 0022fH內容變化情況。記錄實驗結果。回答問題,驗證和你的理論分析結果是否一致。

1.單步執行,在執行push指令和pop指令時,觀察並記錄棧頂偏移地址的寄存器sp值的變化情況。

-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___

2.問題1:題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax和 mov sp, 30執行后, 棧頂的邏輯地址和物理地址分別是?

邏輯地址:0020:0030
物理地址:00230H

3.問題2:單步調試到匯編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 查看此時棧空間數據,給出實驗截圖。

4.問題3:匯編指令 pop [0] 執行結束后, pop [0] 指令執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據是否有變化。給出實驗截圖。

數據沒有發生變化

5.問題4:如果把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令 d 20:0 7查看此時數據空間內的數據是否有變化。給出實驗截圖。

數據兩個為一組倒序。

  • 實驗任務5

 

1.問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov sp, 30 是什么時候執行的?

 

不是,執行之后立即執行mov sp,30這條命令后再暫停。

 

2.問題2:根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因。

 

雖然初始時已通過f命令將初始棧空間全部填充為0,但棧空間之后會存入段地址和偏移地址,棧空間內存單元值隨之變化。

 

  • 實驗任務6

使用任何一款文本編輯器,編寫8086匯編程序源碼。 task6.asm

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對程序匯編鏈接過程截圖,以及,運行可執行程序task5.exe的運行結果截圖

 

3.給出在debug中查看task5.exe的程序段前綴PSP的截圖。

  • 實驗任務7

下面程序的功能是,完成自身代碼的自我復制:把 mov ax, 4c00h之前的指令復制到內存0:200開始的 連續的內存單元。

補全程序,並在debug中調試驗證,確認是否正確實現了復制要求。

1.給出補全后的完整源碼。說明程序中兩個空填寫的依據。

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

 

  1. cs cs代表代碼的起始位置
  2. 17h 到mov ax,4c00h時ip存儲的數據就是循環的次數

2.在debug中調試,使用g命令將程序執行到loop s 之后、mov ax, 4c00h 之前,然后,使用u命令對0:200開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。給出使用g命令運行到指定點和使用u命令反匯編0:200到復制代碼長度這一段內存空間的截圖。

由-u命令可得成功復制。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM