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


一、實驗目的

  1. 掌握8086CPU、寄存器、內存(包括棧空間)的基礎知識

  2. 掌握匯編源程序組成與結構

  3. 理解和掌握寄存器間接尋址方式[bx]

  4. 掌握匯編指令mov, add, sub, jmp, push, pop,loop的用法,理解高級語言的表達和抽象機制

  5. 熟練掌握使用debug工具編寫和調試x86匯編命令的方法

  6. 掌握匯編語言源程序編寫→匯編→鏈接→調試的工具和方法

二、實驗准備

  1. 復習教材1-5章

  2. 准備好軟件實驗環境

    軟件,及其安裝說明文檔,請從課程q群->實驗文件夾下載。

  3. 熟悉工具用法

    • debug工具用法,參照:

      • 教材實驗1「1 預備知識:Debug的使用」
      • 教材實驗2 「1 預備知識:Debug的使用」
    • 文檔「debug工具簡介及用法.pdf」。可從課程q群->實驗文件夾下載。

    • masm、link及運行可執行程序的方法,參照教材第4章。

四、實驗結論

1. 實驗任務1

自行練習,掌握工具用法。此部分無需寫實驗結論。

如練習中遇到、發現問題,使用搜索引擎,以及,和同學討論后,都暫時未能得到解決或釋疑,可以寫

入這一部分。共大家一起討論。

實驗一:

​ 1. 使用a指令將指令寫入內存中,用u查看看結果如下:

  1. 使用t命令執行如下:

  1. 求2的8次方

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

實驗2:

  1. 輸入程序:

  1. 執行結果

    見書

2. 實驗任務2

  1. 通過d命令查看ROM生產日期:,在最后的數據段,顯示生成日期為1992/01/01

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

3. 實驗任務3

  • 給出在debug中使用e命令修改內存單元的命令,及,效果截圖

  • 給出在debug中使用f命令批量填充內存單元的命令,及,效果截圖

  • 嘗試修改內存單元,或,數據后的效果截圖

  1. 使用e命令修改內存

  1. 使用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

  1. 代碼

因為需要實現程序復制,根據上下文可以判斷出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


免責聲明!

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



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