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

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

是否一致 bubuko 練習 寫入 bsp 體會 16px 姓名 行程

南京信息工程大學實驗報告

實驗名稱 實驗2 用機器指令和匯編指令編程

實驗日期 11.12

得分

學院 計軟院

專業 計科

年級 2017級

班次 6班

姓名 江軻禹

學號 20171308227

一、實驗目的

1. 熟練掌握使用debug工具編寫和調試匯編命令的方法 2. 理解並掌握內存中多字節數據的存放 3. 理解並掌握「棧」內存空間的特性和使用 4. 理解並掌握8086匯編指令mov, add, sub, push, pop的用法

二、實驗準備

1. 復習第 3 章「棧」的知識:棧的特性、寄存器 SS 和 SP、指令 push 和 pop 2. 完成教材 3.6~3.9 節內的問題 3.6~3.12,檢測點 3.1~3.2 3. 結合教材實驗1 (P35)及公郵文件中心→實驗下的 “實驗1輔助文檔.pdf”復習debug 工具用法。

三、實驗內容

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 中調試,觀察實驗結果與理論分析是否一致,如不一致,嘗試 發現問題所在,並分析原因。

四、實驗結論

實驗任務(1):

① 截圖記錄:使用 e 命令修改 0021:0~0021:f 數據,及修改後查看是否正確寫入的操 作

② 截圖記錄:使用 a 命令輸入的 p74 指令

③ 截圖記錄:每一行指令單步調試(如單步調試步驟多,可分屏截圖,但不要有遺漏)

④ P74 中指令執行後各個寄存器填空結果,以在文檔中手工標註或手機拍照截圖方式 復制在文檔中。 對於③單步調試的觀察,與理論上分析的結果進行比較,檢驗是否一致。 如不一致,分析查找原因。

修改前先用-d命令查看 0021:0~0021:f 的數據,再用e命令修改數據,修改後再用d命令查看是否正確寫入

技術分享圖片

使用-a命令輸入指令

技術分享圖片

用-t命令執行每一條語句

技術分享圖片

技術分享圖片

技術分享圖片

執行以上指令後,各寄存器內值的情況:

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 ;修改的內存單元的地址是2200:FE內容為6462

push bx ;sp= 00FC ;修改的內存單元的地址是2200:FC內容為6A6C

pop ax ;sp= 00FE ;ax=6C6A

pop bx ;sp= 0100 ;bx=6462

push [4] ;sp= 00FE ;修改的內存單元的地址是2200:FE內容為3435

push [6] ;sp= 00FC ;修改的內存單元的地址是2200:FC內容為3736

以上命令將內存單元2200:FE和內存單元2200:FC的值進行了交換

通過觀察不難發現,指令mov sp 0100似乎沒有執行, 實際上,在T命令執行mov ss,ax時,下一條指令mov sp,0100 也緊接著被執行。

關於這點,書上是這麽解釋的:Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接著被執行

實驗任務(2):

① 截圖記錄圖 3.19 中使用 a命令輸入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改後查看的部分

② 單步調試每一行匯編指令的截圖。且每一條指令單步調試後,都使用 d 命令查看 2000:0~2000:f 的值。觀察每一條指令執行後相關寄存器值的變化,及 2000:0~2000:f 單 元值的變化,並思考原因。

技術分享圖片

技術分享圖片

前三段指令的通過修改段寄存器SS和寄存器SP的值來修改棧頂的段地址和偏移地址 。

命令mov sp,0010修改了偏移地址,使得任意時刻SS:SP都指向棧頂元素,so~初始的棧頂元素為0010?

五、總結與體會

通過本次實驗

1)對棧的概念以及棧元素的存放和修改有了進一步的了解

2)了解到”Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接著被執行”

3)關於中斷機制(以下內容摘自百度百科):

眾所周知,處理器的速度跟外圍硬件設備的速度往往不在一個數量級上,因此,如果內核采取讓處理器向硬件發出一個請求,然後專門等待回應的辦法,顯然降低內核效率。

既然硬件的響應這麽慢,那麽內核就應該在此期間處理其他事務,等到硬件真正完成了請求的操作之後,再回過頭來對它進行處理。想要實現這種功能,輪詢(polling)可能會是一種解決辦法。可以讓內核定期對設備的狀態進行查詢,然後做出相應的處理。不過這種方法很可能會讓那個內核做不少無用功,因為無論硬件設備是正在忙碌著完成任務還是已經大功告成,輪詢總會周期性的重復執行。更好的辦法是由我們來提供一種機制,讓硬件在需要的時候再向內核發出信號(變內核主動為硬件主動),這就是中斷機制。 中斷使得硬件得以與處理器進行通信。舉個例子,在你敲打鍵盤的時候,鍵盤控制器(控制鍵盤的硬件設備)會發送一個中斷,通知操作系統有鍵按下。中斷本質是一種特殊的電信號,由硬件設備發向處理器。處理器接受到中斷後,會馬上向操作系統反映此信號的到來,然後就由os負責處理這些新到來的數據。硬件設備生成中斷的時候並不考慮與處理器的時鐘同步——換句話說就是中斷隨時可以產生。因此,內核隨時可能因為新到來的中斷而被打斷。 不同的設備對應的中斷不同,而每個中斷都通過一個惟一的數字標識。因此,來自鍵盤的中斷就有別於來自硬盤的中斷,從而使得操作系統能夠對中斷進行區分,並知道哪個硬件設備產生了哪個中斷。這樣,操作系統才能給不同的中斷提供不同的中斷處理程序。 在它執行程序的時候,如果有另外的事件發生(比如用戶又打開了一個程序)那麽這時候就需要由計算機系統的中斷機制來處理了。 中斷機制包括硬件的中斷裝置和操作系統的中斷處理服務程序。 讓硬件在需要的時候再向內核發出信號。

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