實驗二用機器指令和匯編指令編程
1. 教材實驗 2(P71)
(1)練習「1.預備知識:Debug 的使用」
(2)在練習基礎上,完成「2. 實驗任務」補充:
為了便於驗證實驗結果,對「2. 實驗任務」中的(1)做如下兩點調整:
①在使用 a 命令輸入指令調試前,使用 e 命令將內存單元 0021:0 ~0021:7 連續 8 個字節數據修改為 30H, 31H, 32H, 33H,34H,35H,36H,37H
②將 P74 實驗任務(1)中第 1 行的 mov ax, ffff → 改為 mov ax, 0021 實驗前,請理論上分析指令執行後各個填空處的值,並記錄下來。
實驗時,通過在 debug 中調試,觀察實驗結果與理論分析是否一致,如不一致,嘗試。
發現問題所在,並分析原因。
p71練習實驗截圖如下:
練習實驗分析:mov sp,10被執行了嗎?
在程序執行前,ax=0000,ss=0b39,sp=ffee
在用T命令單步執行mov ax,2000後,ax=2000; ss=0b39; sp=ffee
在用T命令單步執行mov ss,ax後,ax=2000;ss=2000;sp=0010
註意,在用T命令單步執行mov ss,ax 前,ss=0b39,sp=ffee,而執行後ss=2000,sp=0010。ss變為2000是正常的,這正是mov ss,ax的執行結果。sp變為0010是在mov ss,ax之後,因為它就是mov ss,ax的下一條指令。顯然,在用T命令執行mov ss,ax的時候,它的下一條指令 mov sp,10也緊接著執行了。
實驗任務(1):
① 截圖記錄:使用 e 命令修改 0021:0~0021:f 數據,及修改後查看是否正確寫入的操作
② 截圖記錄:使用 a 命令輸入的 p74 指令
③ 截圖記錄:每一行指令單步調試(如單步調試步驟多,可分屏截圖,但不要有遺漏)
④ P74 中指令執行後各個寄存器填空結果,以在文檔中手工標註或手機拍照截圖方式復制在文檔中。 對於③單步調試的觀察,與理論上分析的結果進行比較,檢驗是否一致。
實驗二是在機房做的,當時沒有查看修改後地址。在自己電腦重新修改截圖如下:
前半部分輸入a命令實驗截圖如下:
t命令單步執行截圖如下:
第一部分得出結論:
ax=3130
ax=6462
bx=3534
bx=6C6A
後兩部分結果如下:
sp=00FE;修改的內存單元的地址是 2200:FE到FF 內容為62 64
ax入棧 sp=sp-2=0100H-2 =00FEH
sp=00FC;修改的內存單元的地址是 2200:FC到FD 內容為6A 6C
bx入棧 sp=sp-2=00FEH-2=00FCH
sp=00FE;ax=6C6A
sp=0100;bx=6462
push [4] sp=00FE;修改的內存單元的地址是 2200:FE到FF 內容為 34 35
push [6] sp=00FC;修改的內存單元的地址是 2200:FC到FD 內容為 36 37
由於疏忽,手寫時錯誤的將得出結論的步驟弄錯了一步,導致結果出現了上下相錯的偏差,應註意。
實驗任務(2):
① 截圖記錄圖 3.19 中使用 a命令輸入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改後查看的部分
② 單步調試每一行匯編指令的截圖。且每一條指令單步調試後,都使用 d 命令查看
2000:0~2000:f 的值。觀察每一條指令執行後相關寄存器值的變化,及 2000:0~2000:f 單元值的變化,並思考原因。
用自己電腦做分步步驟如下:
分析結論:
初始的棧頂和棧底分別是2000:0010和2000:0010。
如練習實驗(3)一樣,執行中斷例程時,CPU會將一些中斷例程使用的的寄存器變量自動壓棧到棧中,包括了上述的寄存器變量的值,命令緊接著執行。
實驗二用機器指令和匯編指令編程