1. 程式人生 > 其它 >實驗一 8086彙編指令編碼和除錯

實驗一 8086彙編指令編碼和除錯

一、實驗目的

  1. 掌握8086CPU、暫存器、記憶體(包括棧空間)的基礎知識
  2. 掌握彙編源程式組成與結構
  3. 理解和掌握暫存器間接定址方式
  4. 掌握彙編指令mov, add, sub, jmp, push, pop,loop的用法,理解高階語言的表達和抽象機制
  5. 熟練掌握使用debug工具編寫和除錯x86彙編命令的方法
  6. 掌握組合語言源程式編寫→彙編→連結→除錯的工具和方法

二、實驗結論

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時,已經把源程式程式碼複製到了目標空間

三、實驗總結

  1. 通過debug除錯加深了對指令執行的底層邏輯的理解;
  2. 對ss和sp的設定為原子操作,中間出現中斷也會執行完整個過程再響應中斷(原因);
  3. 程式響應中斷時,為了處理完中斷能恢復現場,會先將標誌暫存器,cs,ip壓棧。