一、實驗目的
-
掌握8086CPU、寄存器、內存(包括棧空間)的基礎知識
-
掌握匯編源程序組成與結構
-
理解和掌握寄存器間接尋址方式[bx]
-
掌握匯編指令mov, add, sub, jmp, push, pop,loop的用法,理解高級語言的表達和抽象機制
-
熟練掌握使用debug工具編寫和調試x86匯編命令的方法
-
掌握匯編語言源程序編寫→匯編→鏈接→調試的工具和方法
二、實驗准備
-
復習教材1-5章
-
准備好軟件實驗環境
軟件,及其安裝說明文檔,請從課程q群->實驗文件夾下載。
-
熟悉工具用法
-
debug工具用法,參照:
- 教材實驗1「1 預備知識:Debug的使用」
- 教材實驗2 「1 預備知識:Debug的使用」
-
文檔「debug工具簡介及用法.pdf」。可從課程q群->實驗文件夾下載。
-
masm、link及運行可執行程序的方法,參照教材第4章。
-
四、實驗結論
1. 實驗任務1
自行練習,掌握工具用法。此部分無需寫實驗結論。
如練習中遇到、發現問題,使用搜索引擎,以及,和同學討論后,都暫時未能得到解決或釋疑,可以寫
入這一部分。共大家一起討論。
實驗一:
1. 使用a指令將指令寫入內存中,用u查看看結果如下:

- 使用t命令執行如下:

- 求2的8次方

- 在內存b810:0中寫入 01 01 02 02 03 03 04 04,實驗結果如下:

實驗2:
- 輸入程序:

-
執行結果
見書。
2. 實驗任務2
- 通過d命令查看ROM生產日期:,在最后的數據段,顯示生成日期為1992/01/01

- 通過e命令修改生成日期,失敗

3. 實驗任務3
-
給出在debug中使用e命令修改內存單元的命令,及,效果截圖
-
給出在debug中使用f命令批量填充內存單元的命令,及,效果截圖
-
嘗試修改內存單元,或,數據后的效果截圖
- 使用e命令修改內存

- 使用f命令批量填充內存單元

4. 實驗任務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_
問題1:
棧頂的物理地址是:0022fH,邏輯地址:0;
問題2:

問題3:
數據沒有變化。

問題4:
數據有變換,數據的順序顛倒了。

5. 實驗任務5
回答問題1和問題2。
問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov sp, 30 是什么時候執行的?
問題2:根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因。
問題1:
是的,使用t命令只會執行一條命令。再次使用t命令,mov sp 30將會執行。
問題2:
第二處划划線的內容剛好存儲的是cs,ip的地址
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,執行的截圖

3.debug查看PSP內容
PSP的內容指的是程序段前面的256字節的保護空間,如下圖所示,就是數據段寄存器ds中的地址和程序段地址之間的差距。

前兩個字節的內容是CD 20.

需要復習PSP相關的知識點。
7.實驗任務7
- 代碼
因為需要實現程序復制,根據上下文可以判斷出ds指向的是復制前程序的地址,所以ds的值就是程序段的段地址cs,
cx在循環中是循環次數,因為程序是每次復制一個字節,所以循環的次數就是程序的長度cx
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,20h
mov es,ax
mov bx,0
mov cx,cx
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

