kernel.S 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; kernel.S - 中断处理程序
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. [bits 32]
  5. %define ERROR_CODE nop
  6. %define ZERO push 0
  7. extern put_str ; 声明外部函数
  8. section .data
  9. intr_str db "interrup occur!", 0xa, 0
  10. global intr_entry_table
  11. intr_entry_table:
  12. %macro VECTOR 2
  13. section .text
  14. intr%1entry: ; 每个中断处理程序都要压入中断向量号,所以一个中断类型一个中断处理程序
  15. %2
  16. push intr_str
  17. call put_str
  18. add esp, 4 ; 清除参数
  19. ; 如果从片上进入的中断,除了从片上发送 EOI 外,还要往主片上发送 EOI
  20. mov al, 0x20 ; EOI 中断结束命令
  21. out 0xa0, al ; 发送给从片
  22. out 0x20, al ; 发送给主片
  23. add esp, 4 ; 清除错误码, error_code
  24. iret ; 中断返回, 会自动从栈中弹出 eip, cs, eflags, esp, ss
  25. section .data
  26. dd intr%1entry ; 存储各个中断入口程序的地址,形成 intr_entry_table 数组
  27. %endmacro
  28. VECTOR 0x00, ZERO
  29. VECTOR 0x01, ZERO
  30. VECTOR 0x02, ZERO
  31. VECTOR 0x03, ZERO
  32. VECTOR 0x04, ZERO
  33. VECTOR 0x05, ZERO
  34. VECTOR 0x06, ZERO
  35. VECTOR 0x07, ZERO
  36. VECTOR 0x08, ZERO
  37. VECTOR 0x09, ZERO
  38. VECTOR 0x0a, ZERO
  39. VECTOR 0x0b, ZERO
  40. VECTOR 0x0c, ZERO
  41. VECTOR 0x0d, ZERO
  42. VECTOR 0x0e, ZERO
  43. VECTOR 0x0f, ZERO
  44. VECTOR 0x10, ZERO
  45. VECTOR 0x11, ZERO
  46. VECTOR 0x12, ZERO
  47. VECTOR 0x13, ZERO
  48. VECTOR 0x14, ZERO
  49. VECTOR 0x15, ZERO
  50. VECTOR 0x16, ZERO
  51. VECTOR 0x17, ZERO
  52. VECTOR 0x18, ZERO
  53. VECTOR 0x19, ZERO
  54. VECTOR 0x1a, ZERO
  55. VECTOR 0x1b, ZERO
  56. VECTOR 0x1c, ZERO
  57. VECTOR 0x1d, ZERO
  58. VECTOR 0x1e, ERROR_CODE
  59. VECTOR 0x1f, ZERO
  60. VECTOR 0x20, ZERO