要及時處理外設的輸入,顯然需要解決兩個問題:
外設的輸入隨時可能發生,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指...