首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

保護模式中斷處理實戰:時鐘中斷與陷阱門顯示倒計時

     編輯:組合語言

本文展示一個完整的 80386 保護模式程式,演示外部中斷(時鐘中斷 IRQ0,向量 08H)與軟中斷/陷阱門(向量 0FEH)的協同處理。程式在螢幕左上角以倒計時顯示秒數,時間歸零後結束返回實模式。

系統結構概覽

程式包含以下核心元件:

  • GDT:全域描述符表,含代碼/資料/堆疊/視訊緩衝區/各處理程序段描述符
  • IDT:中斷描述符表,256 條門描述符。08H 設為中斷門指向時鐘處理程序;0FEH 設為陷阱門指向顯示程序;其餘指向通用異常處理程序
  • 時鐘中斷處理程序 (08H):計數 18 次(約 1 秒),遞減顯示計數,呼叫 0FEH 顯示
  • 顯示程序 (0FEH):陷阱門處理程序,直接寫入視訊緩衝區顯示當前倒計時數字
  • 演示主程序:初始化保護模式、載入 GDTR/IDTR/LDTR/TR、開啟中斷、等待結束標誌
  • 臨時程序:協助模式切換與返回實模式

關鍵技術細節

1. 時鐘中斷仍用 08H 向量

為簡化演示,未重設 8259A 中斷控制器向量。08H 與雙重錯誤異常共用向量,但程式屏蔽所有外部中斷除時鐘外,且確保不觸發雙重錯誤,故無衝突。

2. 中斷處理程序現場保護

時鐘中斷透過中斷門進入,不發生任務切換,但必須手動保存/恢復通用暫存器、段暫存器(EAX, DS, FS, GS 等),並在結束時發送 EOI (End of Interrupt, 20H) 給主 8259A。

3. 陷阱門實現顯示功能

時鐘處理程序透過 INT 0FEH 呼叫顯示程序。陷阱門不屏蔽中斷,類似實模式下的 BIOS INT 10H。顯示程序直接操作視訊記憶體(B800:0000),高效且無閃爍。

4. 通用異常處理程序

其餘 254 個 IDT 項目指向同一處理程序:顯示藍底白字 ! 並死循環。演示邏輯保證不會觸發。

5. 無特權級切換

所有處理程序均在特權級 0 執行,簡化堆疊切換邏輯。

6. IDTR 儲存與載入

  • SIDT:儲存當前 IDTR 到偽描述符 NORVIDTR,以便返回實模式時恢復
  • LIDT:載入新建立的 IDT 偽描述符 VIDTR

完整原始碼結構

原始碼採用 TASM 理想模式語法,包含巨集定義(386SCD.INC)、段定義(GDT, IDT, 各代碼/資料段)、初始化流程(InitGDT, InitIDT)、模式切換(CR0.PE=1)、主迴圈與清理返回。完整程式碼見原文,此處不再贅述。

學習價值

此範例完整展示了保護模式下:

  1. GDT/IDT/LDT/TSS 的建立與載入
  2. 中斷門與陷阱門的配置與使用
  3. 外部中斷處理流程(現場保護、EOI、嵌套調用軟中斷)
  4. 實模式與保護模式雙向切換
  5. 直接視訊記憶體操作

是學習 x86 系統程式設計、作業系統核心機制的優秀教材。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved