外中斷 彙編學習筆記

2021-08-26 08:40:40 字數 2525 閱讀 5031

要及時處理外設的輸入,顯然需要解決兩個問題:

外設的輸入隨時可能發生,cpu如何得知?

cpu從何處得到外設的輸入?

外設的輸入不直接送入記憶體和cpu,而是送入相關的介面晶元的埠中;cpu向外設的輸出也不是直接送入外設,而是先送入埠中,再由相關的晶元送到外設。cpu還可以向外設輸出控制命令,而這些控制命令也是先送到相關晶元的埠中,然後再由相關的晶元根據命令對外設實施控制。

有一種中斷資訊,來自於cpu外部,當cpu外部有需要處理的事情發生的時候,比如說,外設的輸入到達,相關的晶元將向cpu發出相應的中斷資訊。cpu在執行完當前指令後,可以檢測到傳送過來的中斷資訊,引發中斷過程,處理外設的輸入。

在pc系統中,外中斷源一共有以下兩類。

(1)可遮蔽中斷

可遮蔽中斷是cpu可以不響應的外中斷。cpu是否響應可遮蔽中斷,要看標誌暫存器的if位的設定。如果if=1,則cpu在執行完當前指令後響應中斷,如果if=0,則不響應可遮蔽中斷。

過程如下:

如果if=1,則執行下面4步;反之,則不執行

取中斷型別碼n

標誌暫存器入棧,if=0,tf=0

cs、ip入棧(i

p)=(

n∗4)

,(cs

)=(n

∗4+2

) (ip

)=(n

∗4),

(cs)

=(n∗

4+2)

8086cpu提供的設定if的指令如下:

sti,設定if=1

cli,設定if=0

(2)不可遮蔽中斷不可遮蔽中斷是cpu必須響應的外中斷。當cpu檢測到不可遮蔽中斷資訊時,則在執行完當前指令後,立即響應,引發中斷過程。

對於8086cpu,不可遮蔽中斷的中斷型別碼固定為2,所以中斷過程:

標誌暫存器入棧,if=0,tf=0

cs、ip入棧(i

p)=(

8),(

cs)=

(0ah

) (ip

)=(8

),(c

s)=(

0ah)

幾乎所有由外設引發的外中斷,都是可遮蔽中斷。當外設有需要處理的事件發生時,相關晶元向cpu發出可遮蔽中斷資訊。不可遮蔽中斷是在系統中有必須處理的緊急情況發生時用來通知cpu的中斷資訊。在這門課程中,主要討論可遮蔽中斷。

很通俗易懂,略過。

鍵盤輸入的處理過程:

鍵盤產生掃瞄碼

掃瞄碼送入60h埠

引發9號中斷

cpu執行int 9中斷例程處理鍵盤輸入

內容自己看,也很易讀。

檢測點 15.1

(1)仔細分析一下上面的int 9中斷例程,看看是否精簡一下?其實在我們的int 9中斷例程中,模擬int指令呼叫原int 9中斷例程的程式段可以精簡的,因為在進入中斷例程後,if和tf都已經置0,沒有必要再進行設定了,對於程式段:

pushf

pushf

pop ax

and ah,11111100b

push ax

popf

call dword ptr ds:[0]

可以精簡為:

pushf

call

dword

ptrds:[0]

(2)仔細分析上面程式中的主程式,看看有什麼潛在問題?在主程式中,如果在執行設定int 9中斷例程的段位址和偏移位址的指令之間發生了鍵盤中斷,則cpu將轉去乙個錯誤的位址執行,將發生錯誤。找出這樣的程式段,改寫它們,排除潛在問題。(提示,注意sti和cli指令的用法)

答:應該在執行設定int 9的cs之前將if置0,設定int 9的ip之後將if置1(設定新int 9的地方和設定舊int 9的地方,這2處需要將if置0和置1)。

略過。cpu對外設輸入的通常處理方法:

外設的輸入送入埠

向cpu發出外中斷(可遮蔽中斷)資訊

cpu檢測到可遮蔽中斷資訊,如果if=1,cpu在執行完當前指令後響應中斷,執行相應的中斷例程

可在中斷例程中實現對外設輸入的處理

安裝乙個新的int 9中斷例程,功能:在dos下,按下「a」鍵後,除非不再鬆開,如果鬆開,就顯示滿螢幕的「a」;其他的按鍵照常處理。

分析:在安裝新int 9的時候,將原int 9的入口位址記錄下來(可以在int 9的code段之前定義乙個data段,用來記錄原int 9中斷例程的cs和ip)

安裝新的int 9中斷例程

如果遇到a的斷碼,則執行新int 9的指令

否則,執行原int 9的指令,而入口位址已經被我們記錄下來了

組合語言 埠和外中斷

和cpu通過匯流排相連的晶元除了各種儲存器外,還有一些其他的晶元,例如網絡卡顯示卡等。從cpu的角度,將這些暫存器都當作埠,對它們進行統一編址,從而建立了乙個統一的埠位址空間,每乙個埠的位址空間都有乙個位址。在訪問埠的時候,cpu通過埠位址來定位埠。因為埠所在的晶元和cpu通過匯流排相連,所以,埠位...

組合語言學習筆記 第十五章 外中斷

外設的輸入不直接送入記憶體和cpu,而是送入相關的介面晶元的埠中。cpu向外設輸出,也是要先送入埠,由相關晶元到外設。cpu通過埠和外部裝置進行聯絡 外中斷資訊,來自於cpu外部,當cpu外部有需要處理的事情發生的時候,比如,外部的輸入到達,相關晶元將向cpu發出相應的中斷資訊。cpu在執行完當前指...

8086彙編學習筆記9 中斷

中斷訊號可以來自cpu內部或外部。一.8086cpu內部中斷訊號有 1 除法錯誤 2 單步執行 3 執行into指令 4 執行int指令 1.中斷碼 8086用乙個位元組來描述中斷碼,可以表示256中不同的中斷資訊。除法錯誤中斷碼為0 單步執行中斷碼為1 執行into指令中斷碼為4 執行int n指...