計算機的相當多的功能都是建立在其支援中斷機制的基礎上的。
本篇文章從細節入手分析下cpu進行中斷的過程。
部分常見中斷
- 0号中斷:除法錯誤中斷
- 1号中斷:單步調試中斷
- 2号中斷:非屏蔽中斷
- 3号中斷:斷點中斷
- 4号中斷:溢出中斷
CPU中斷原理
- 标緻寄存器
位,當CPU檢測到TF
位為1時,會在執行完下一條指令的時候觸發1号中斷。TF
-
指令,機器碼0xCC,cpu執行本條指令後會觸發3号中斷。int3
-
指令,機器碼0xCE,cpu執行完本條指令後檢測标志寄存器into
位,若為1則觸發4号中斷,否則什麼也不做。OF
-
計算機的可屏蔽外中斷中斷控制器是兩個8259A晶片,采用級聯方式,共提供15個外中斷。
BIOS引導程式中對兩個控制晶片進行初始化,主片提供的中斷号為
,從片中斷号為08~0FH
。從片連接配接到主片中斷号為70H~77H
0AH
引腳上。
這些中斷為可屏蔽外中斷,所謂可屏蔽是指受CPU标志寄存器
位控制,IF
位置位CPU才響應這些中斷,若IF
位清零,則CPU不響應這些中斷的請求,是以程式可以通過改變IF
位來打開或屏蔽這些中斷請求。所用指令為IF
和sti
。cli
- 2号中斷為非屏蔽外中斷,不受CPU狀态影響,CPU收到請求後必須響應。
- 外中斷隻有這些,2号不可屏蔽中斷通過一個引腳NMI同CPU連接配接,8259A主片INT引腳通過一個引腳INTR同CPU連接配接,沒有其他外中斷類型了。
- 除外中斷外其他中斷為内中斷,即全部來自于CPU内部,也全部都不受标志寄存器屏蔽。
CPU響應中斷過程
- 取中斷類型碼也就是中斷号。
- 标志寄存器入棧
- 标志寄存器
、TF
位清零IF
-
、CS
寄存器相繼入棧。IP
- 根據中斷類型碼查找中斷向量表,然後遠轉移到中斷例程執行代碼。
還有一個注意事項就是,CPU在每讀入一條指令後,
IP
寄存器會自動累加讀入指令的長度,進而指向下一條指令,然後才執行本條指令。是先改變
IP
再執行指令。
下面的彙程式設計式示範了CPU響應中斷的過程。
;檔案名:mymbr.asm
;建立日期:2015/02/08
;編譯指令:nasm -f bin mymbr.asm -o mymbr
;
;程式功能:
; 作為主引導扇區(MBR)加載,
; 開機後螢幕左上角顯示字元‘A’,直到按下鍵盤按鍵,顯示字元‘3’,
; 每按下一次按鍵顯示字元‘1’并改變顯示顔色。
[bits 16] ;16位模式編譯
cli ;關閉外中斷
mov ax, 0B800H ;ds段指向顯存
mov ds, ax
mov byte [0], 'A' ;在螢幕左上角顯示字母‘A’
xor ax, ax ;es段指向記憶體位址0
mov es, ax
mov word [es:3*4], int3_start+07C00H ;安裝斷點(3号)中斷入口位址
mov word [es:3*4+2], 0
mov word [es:1*4], int1_start+07C00H ;安裝單步(1号)中斷入口位址
mov word [es:1*4+2], 0
mov al, 1111_1111B ;中斷控制器8259從片屏蔽所有外中斷
out 0A1H, al
and al, 1111_1101B ;中斷控制器8259主片屏蔽除鍵盤中斷(9号)外所有外中斷
out 021H, al
sti ;打開外中斷
hlt ;進入停機狀态,可以被鍵盤中斷(9号)喚醒
hlt
int3 ;觸發斷點中斷(3号)
jmp $ ;本條指令無限循環自身
;3号中斷中斷例程
;作用:
; 在螢幕左上角顯示字元‘3’
; 停機等待直到被外中斷喚醒
; 傳回後将标緻寄存器TF位置位
int3_start:
sti ;打開外中斷
mov byte [0], '3' ;螢幕左上角顯示字元‘3’
mov bp, sp
or word [bp+4], 0100H ;修改堆棧中标志寄存器TF位為1,使中斷傳回後TF位置位
hlt ;停機等待直到被外中斷喚醒
hlt
iret ;傳回
;1号中斷中斷例程
;作用:
; 在螢幕左上角顯示字元‘1’,并改變顯示顔色
; 停機等待直到被外中斷喚醒
int1_start:
sti ;打開外中斷
mov byte [0], '1' ;螢幕左上角顯示字元‘1’
inc byte [1] ;改變螢幕左上角顯示顔色
hlt ;停機等待直到被外中斷喚醒
hlt
iret ;傳回
times 510-($-$$) db 0 ;填0補齊,使程式長度正好512位元組
db 55h, 0AAH ;mbr引導區校驗字元