一.實驗準備學習
1.爲了便於驗證明驗結果,對「2. 實驗任務」中的(1)作以下調整:spa
在使用 a 命令輸入指令調試前,使用 e 命令將內存單元 0021:0 ~0021:7 連續 8 3d
個字節數據修改成 30H, 31H, 32H, 33H,34H,35H,36H,37H調試
2.修改完成後,用d命令進行查看是否完成了修改code
二.使用Debug,將書中的事例程序段寫入內存,逐條執行,根據指令執行後的實際運行狀況完成書中填空blog
1.用a命令將事例彙編指令寫入內存(注:第 1 行的 mov ax, ffff → 改成 mov ax, 0021)內存
2.實驗前根據理論知識進行書中內容填空io
mov ax,0021 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax = 3130 add ax,[2] ;ax = 6462 mov bx,[4] ;bx = 3534 add bx,[6] ;bx = 6C6A push ax ;sp = 00FE;修改的內存單元的地址是220FE內容爲6462 push bx ;sp = 00FC;修改的內存單元的地址是220FC內容爲6C6A pop ax ;sp = 00FE;ax = 6C6A pop bx ;sp = 0100;bx = 6462 push [4] ;sp = 00FE;修改的內存單元地址是220FE內容爲3534 push[6] ;sp = 00FC;修改的內存單元地址是220FC內容爲3736
3.在單步執行彙編指令前,先使用r命令查看寄存器的初始值class
棧頂的初值爲ss=073F,棧底的初值爲sp=00FDbug
4.使用t命令進行單步逐條執行
這裏面的代碼中,在執行mov ss,ax後,應該待執行指令是mov sp,0100,但彷佛跳過了這一句,而去待執行
下一句mov ax,[0].但對比觀察後發現雖然mov sp,0100並無顯示待執行,實際上仍是產生了執行了的效果,
sp的值被設爲0100。能夠當作mov ss,ax與mov sp,0100同時執行了
上面的執行語句中,出現了不少pop,push出棧,入棧語句,在入棧時sp = sp-2.在出棧時sp=sp+2
5.比對實驗結果與理論填空
能夠發現事先的填空內容與實驗結果是一致的
三.仔細觀察書中事例圖的實驗過程,而後分析:爲何2000:0~2000:f中的內容會發生改變
1.按圖中代碼敲入
並用e命令修改2000:0~2000:f(第一條指令將ax的值設爲2000H)內存單元的內容,用d指令查看是否修改爲功
2.用r指令查看各寄存器初值
初始棧頂SS爲073F,初始棧底SP是00FD,待執行語句爲mov ax,2000
3.用t指令逐條執行
執行了mov ax,2000彙編指令,將ax寄存器的值設爲2000,待執行指令 mov ss,ax
棧頂地址寄存器SS的值按指令設爲了2000,在這裏出現了上一個實驗同樣的狀況,
在這裏咱們進行詳細分析按逐條執行的順序來講,下一條待執行指令應該是mov sp,10.
但這裏彷佛跳過了這條指令,待執行指令爲mov ax,3123,經仔細比對寄存器內容
單步執行mov ss,ax前,ax = 2000;ss=073f;sp=00fd
單步執行mov ss,ax後,ax = 2000;ss=2000;sp=0010
發現SP的值被設爲了10,也就是說mov ss,ax和mov sp,10同時執行了
通常狀況下,用T命令執行一條指令後,會中止繼續執行,顯示出當前CPU各個寄存器
的狀態和下一步要執行的指令,但T命令執行mov ss,ax指令時倒是同下一條指令一同執行
了,根據上一個實驗和這個實驗猜想在修改棧段寄存器SS指令時會出現這種狀況
經瞭解這種現象是因爲中斷機制形成的,Debug的T命令在執行修改寄存器SS的指令時,下一
條指令也緊接着被執行了。
執行了mov ax,3123將ax的值設爲3123,待執行push ax
執行了push ax語句,將ax寄存器內容入棧,棧底寄存器sp相應的發生變化,待執行mov ax,3366
後面均按照逐步執行的順序進行執行了
四.總結
經過這次實驗理解並掌握了「棧」內存空間的特性和使用理解並掌握 8086 彙編指令
mov, add, sub, push, pop 的用法,切實體會到「棧」內存空間的複雜性,不只要考慮到越界
,還發現了中斷機制的存在,只是如今咱們還沒法深刻了解中斷機制,期待在後續課程的學習中可以
深刻研究其內在緣由。