實驗一 8086彙編指令編碼和除錯
一、實驗目的
- 掌握8086CPU、暫存器、記憶體(包括棧空間)的基礎知識
- 掌握彙編源程式組成與結構
- 理解和掌握暫存器間接定址方式
- 掌握彙編指令mov, add, sub, jmp, push, pop,loop的用法,理解高階語言的表達和抽象機制
- 熟練掌握使用debug工具編寫和除錯x86彙編命令的方法
- 掌握組合語言源程式編寫→彙編→連結→除錯的工具和方法
二、實驗結論
1. 實驗任務1
略
2. 實驗任務2
d命令檢視生產日期:
e命令修改生產日期:
結論:不能修改,該段記憶體空間為ROM只讀儲存器,不能改寫
3. 實驗任務3
e命令修改記憶體單元:
資料寫入視訊記憶體中,直接顯示在螢幕上(愛心)
f命令批量填充記憶體單元:
修改記憶體單元和資料:
修改記憶體單元顯示的位置變化,修改資料顯示的符號變化
4. 實驗任務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:
邏輯地址:0020:30H
實體地址:0230H
問題2:
push [6]執行完時的棧空間:
問題3:
pop [0]執行完的資料空間:
資料無變化
問題4:
pop命令改變順序後,執行完時的資料:
資料有變化
5. 實驗任務5
問題1: 使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?
並不是,t命令單步執行mov ss,ax後沒有暫停,連同後面的mov sp,30也執行了。
查閱資料發現對ss和sp的設定是原子操作,t命令單步執行設定ss的指令時會把兩條指令都執行完再暫停。
原因:
ss:sp聯合指向棧頂,對它們的設定應該是一個原子操作。假如在mov ss,ax後響應中斷,那麼要將標誌暫存器,cs,ip壓棧,但此刻sp設定尚未完成,就會出現error。所以ss設定完成後,不響應中斷,下一條指令自動執行,兩條指令執行完的時候才響應單步中斷,轉入相應的中斷處理程式,顯示相應的資訊
問題2: 根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因。
t命令執行前三條指令後,可以發現沒執行壓棧指令但棧空間的值產生變化。
原因是使用t命令單步執行時程式產生中斷,為響應中斷,需要先儲存程式的執行狀態,將標誌暫存器,cs,ip壓棧。可以看出此時棧頂的兩個記憶體單元分別儲存當前的ip和cs的值。
6. 實驗任務6
程式原始碼:
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:
執行task6.exe:
debug檢視PSP:
前兩個位元組是CD
7. 實驗任務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中存放程式的段地址,通過ax傳入ds中,後面可直接用loop和[idata]訪問程式各行程式碼;
mov ax,4c00h前面的指令總長度為17h個位元組,迴圈中每次複製一個位元組,需要迴圈17h次;
debug:
g命令執行到mov ax,4c00h時,已經把源程式程式碼複製到了目標空間
三、實驗總結
- 通過debug除錯加深了對指令執行的底層邏輯的理解;
- 對ss和sp的設定為原子操作,中間出現中斷也會執行完整個過程再響應中斷(原因);
- 程式響應中斷時,為了處理完中斷能恢復現場,會先將標誌暫存器,cs,ip壓棧。