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


實驗任務2
(1)在debug中,使用d命令查看生產日期
(2)使用e命令修改生產時期所在的內存單元,修改后,再次使用d命令查看
 
重啟debug,可見未發生變化
結論:ROM內存單元是只讀的,不可以修改。

實驗任務3

(1)在debug中使用e命令修改內存單元

(2)在debug中使用f命令批量填充內存單元
 A0000~BFFFF的內存單元為顯存地址空間,寫入其中的數據會被顯示卡輸出到顯示器上
A0000h - AFFFFh是圖形模式(Graphic Mode)的顯存
B0000h - B7FFFh是黑白文字模式(Mono Text Mode)的顯存
B8000h - BFFFFh是彩色文字模式的顯存
實驗任務4
已知內存單元00201H~00207H中數據如下,用作棧空間:

 

輸入指令進行單步跟蹤

-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 物理地址:00230H

2. 執行到pop[6]前,SP應為執行到PUSH[6]后的值,為2A-2=28

3. pop[0]執行結束后,SP應為pop[0]執行前的2E-2=2C

 
4. 最后4條指令翻轉后,會變成70 80 50 60 30 40 10 20

 

實驗任務5

輸入如下內容

 

 

 

1. 程序沒有暫停,所有對ss寄存器進行值修改的指令執行后,都緊接着執行其下一行指令的修改,所以緊接着執行mov sp 30,顯示下一條為mov ax,2010,debug的單步調試就是一種中斷,而CPU在此期間不響應中斷

2.  0108是偏移地址IP,150F是程序段地址CS,因為中斷時需要保存原來程序的入口

 

實驗任務6

 

使用masm、link,匯編、鏈接,得到可執行文件task5.exe。運行程序。結合程序運行結果,理解程序功能。

 

在debug中,使用d命令,查看task6.exe的程序段前綴,觀察這256個字節的內容,驗證前兩個字節是否是CD 20

 

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
輸出 結果為0123456789
161F :0000處確實為CD 20,以及程序名在161F:0080

實驗任務7

下面程序的功能是,完成自身代碼的自我復制:把 mov ax, 4c00h 之前的指令復制到內存0:200開始的 連續的內存單元。 補全程序,並在debug中調試驗證,確認是否正確實現了復制要求

assume cs:code
code segment
mov ax, cs mov ds, ax  ;數據段就是程序段
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, cx; cxw為程序長度
s: mov al, ds:[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