| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; kernel.S - 中断处理程序
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- [bits 32]
- %define ERROR_CODE nop
- %define ZERO push 0
- extern put_str ; 声明外部函数
- section .data
- intr_str db "interrup occur!", 0xa, 0
- global intr_entry_table
- intr_entry_table:
- %macro VECTOR 2
- section .text
- intr%1entry: ; 每个中断处理程序都要压入中断向量号,所以一个中断类型一个中断处理程序
- %2
- push intr_str
- call put_str
- add esp, 4 ; 清除参数
- ; 如果从片上进入的中断,除了从片上发送 EOI 外,还要往主片上发送 EOI
- mov al, 0x20 ; EOI 中断结束命令
- out 0xa0, al ; 发送给从片
- out 0x20, al ; 发送给主片
- add esp, 4 ; 清除错误码, error_code
- iret ; 中断返回, 会自动从栈中弹出 eip, cs, eflags, esp, ss
- section .data
- dd intr%1entry ; 存储各个中断入口程序的地址,形成 intr_entry_table 数组
- %endmacro
- VECTOR 0x00, ZERO
- VECTOR 0x01, ZERO
- VECTOR 0x02, ZERO
- VECTOR 0x03, ZERO
- VECTOR 0x04, ZERO
- VECTOR 0x05, ZERO
- VECTOR 0x06, ZERO
- VECTOR 0x07, ZERO
- VECTOR 0x08, ZERO
- VECTOR 0x09, ZERO
- VECTOR 0x0a, ZERO
- VECTOR 0x0b, ZERO
- VECTOR 0x0c, ZERO
- VECTOR 0x0d, ZERO
- VECTOR 0x0e, ZERO
- VECTOR 0x0f, ZERO
- VECTOR 0x10, ZERO
- VECTOR 0x11, ZERO
- VECTOR 0x12, ZERO
- VECTOR 0x13, ZERO
- VECTOR 0x14, ZERO
- VECTOR 0x15, ZERO
- VECTOR 0x16, ZERO
- VECTOR 0x17, ZERO
- VECTOR 0x18, ZERO
- VECTOR 0x19, ZERO
- VECTOR 0x1a, ZERO
- VECTOR 0x1b, ZERO
- VECTOR 0x1c, ZERO
- VECTOR 0x1d, ZERO
- VECTOR 0x1e, ERROR_CODE
- VECTOR 0x1f, ZERO
- VECTOR 0x20, ZERO
|