1. 程式人生 > >實驗二用機器指令和匯編指令編程

實驗二用機器指令和匯編指令編程

變量 數據 ron deb 檢驗 是否一致 edi 記錄 方式

1. 教材實驗 2P71

(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會將一些中斷例程使用的的寄存器變量自動壓棧到棧中,包括了上述的寄存器變量的值,命令緊接著執行。

實驗二用機器指令和匯編指令編程