2014-08-30 25 views

回答

2

一箇中斷呼叫只是與推送標誌的常規call類似。而iret所做的是返回並彈出標誌。所以,是的,中斷可以遞歸調用。實際上,由於硬件中斷在系統上連續運行,所以始終在另一箇中斷處理程序中調用中斷,除非當然禁用它們。

硬件中斷有進一步的限制,通常在完成處理之前不會在同一個處理程序中調用。中斷處理程序通過發信號通知中斷控制器來通知硬件提供新的中斷。

+1

事實上,如果你願意,你可以通過簡單地按壓相同的數據來模擬中斷的效果。所以,一箇中斷可能會因爲硬件而中斷另一箇中斷,但是可以產生相同的效果。難以做到的是模擬*優先級較低*中斷的行爲。 – 2014-08-30 16:31:07

2

儘管處理器對嵌套中斷沒有基本限制,但MS-DOS和BIOS服務不可重入。也就是說,在硬件中斷期間調用它們通常是不安全的,因爲在CPU已經執行MS-DOS或BIOS功能時可能發生中斷。

要從硬件中斷服務例程中使用MS-DOS和BIOS服務,可以採取一些步驟來確保它們可以安全使用。你需要做的事情相當複雜,除了其他事情你需要監視InDos標誌並掛接其他中斷,所以我只是將你指向「彙編語言編程的藝術」中的section on reentrency。它涵蓋了所有的細節,做得非常好。

下面是該部分的摘錄。這僅僅是你可能需要做哪些部分:

MS-DOS提供了包含零 一個特殊的一個字節的標誌(INDOS)如果DOS是當前活動和非零值,如果是DOS已經處理應用請求 。通過測試InDOS標誌,您的TSR 可以確定它是否可以安全地進行DOS調用。如果此標誌爲零,則可以始終進行DOS調用。如果這個標誌包含一個,你可能不能進行DOS調用。 MS-DOS提供函數調用,Get InDOS標誌地址,它返回InDOS標誌的地址。要使用 這個函數,用34h加載ah並調用DOS。 DOS將返回es:bx中的InDOS標誌的 地址。如果保存此地址,您的駐留程序將能夠測試InDOS標誌,以查看DOS是否爲 處於活動狀態。

實際上,您應該測試兩個標誌,InDOS標誌和 嚴重錯誤標誌(criterr)。在從TSR調用DOS之前,這兩個標誌都應該包含零 。在DOS版本3.1和更高版本中, 嚴重錯誤標誌出現在InDOS標誌之前的字節中。

那麼如果這些標誌不都爲零,你應該怎麼做?這很容易 足以說「嗨,回來後,當MS-DOS 返回到用戶程序時做這個東西。」但你如何做到這一點?對於 示例,如果鍵盤中斷激活您的TSR,並且您將 控件傳遞給真正的鍵盤處理程序,因爲DOS很繁忙,您不能 期望您的TSR稍後在DOS無 較長時間激活時重新啓動。

訣竅是將您的TSR修補到定時器中斷以及鍵盤中斷 。 [...]

+0

我認爲這個答案離主題太遠了,並且引入了OP沒有詢問的全新的混亂層面(DOS,TSR,...)。 – 2014-08-30 17:54:58

+1

原來的海報給出了一個例子,它使用int 21h作爲主MS-DOS API的軟件中斷,然後詢問「這些嵌套的中斷是否有任何重要的洞穴」。他的具體例子有我在上面的答案中描述的「洞穴」。更一般地說,你不能假定它的安全性是「從中斷服務程序中調用中斷」,因爲你調用的中斷可能被ISR中斷,並且可能不可重入。 – 2014-08-30 18:05:28

相關問題