%macro ISR_NOERRCODE 1 ; nasm宏:定义ISR_NOERRCODE,接收一个参数 [global isr%1] ; %1代表第一个参数 isr%1: cli push byte 0 push %1 jmp isr_common_stub %endmacro %macro ISR_ERRCODE 1 [global isr%1] isr%1: cli push %1 jmp isr_common_stub %endmacro ISR_NOERRCODE 0 ISR_NOERRCODE 1 ISR_NOERRCODE 2 ISR_NOERRCODE 3 ISR_NOERRCODE 4 ISR_NOERRCODE 5 ISR_NOERRCODE 6 ISR_NOERRCODE 7 ISR_ERRCODE 8 ISR_NOERRCODE 9 ISR_ERRCODE 10 ISR_ERRCODE 11 ISR_ERRCODE 12 ISR_ERRCODE 13 ISR_ERRCODE 14 ISR_NOERRCODE 15 ISR_NOERRCODE 16 ISR_ERRCODE 17 ISR_NOERRCODE 18 ISR_NOERRCODE 19 ISR_NOERRCODE 20 ISR_ERRCODE 21 ISR_NOERRCODE 22 ISR_NOERRCODE 23 ISR_NOERRCODE 24 ISR_NOERRCODE 25 ISR_NOERRCODE 26 ISR_NOERRCODE 27 ISR_NOERRCODE 28 ISR_NOERRCODE 29 ISR_NOERRCODE 30 ISR_NOERRCODE 31 [extern isr_handler] ; 将会在isr.c中被定义 ; 通用中断处理程序 isr_common_stub: pusha mov ax, ds push eax ; 存储ds mov ax, 0x10 ; 将内核数据段赋值给各段 mov ds, ax mov es, ax mov fs, ax mov gs, ax call isr_handler ; call isr_headler(registers_t reg); pop eax ; 恢复 mov ds, ax mov es, ax mov fs, ax mov gs, ax popa add esp, 8 ; 弹出错误码和中断ID iret %macro IRQ 2 global irq%1 irq%1: cli push byte 0 push %2 jmp irq_common_stub %endmacro IRQ 0, 32 IRQ 1, 33 IRQ 2, 34 IRQ 3, 35 IRQ 4, 36 IRQ 5, 37 IRQ 6, 38 IRQ 7, 39 IRQ 8, 40 IRQ 9, 41 IRQ 10, 42 IRQ 11, 43 IRQ 12, 44 IRQ 13, 45 IRQ 14, 46 IRQ 15, 47 [extern irq_handler] ; 通用中断处理程序 irq_common_stub: pusha ; 存储所有寄存器 mov ax, ds push eax ; 存储ds mov ax, 0x10 ; 将内核数据段赋值给各段 mov ds, ax mov es, ax mov fs, ax mov gs, ax call irq_handler ; 调用C语言处理函数 pop eax ; 恢复各段 mov ds, ax mov es, ax mov fs, ax mov gs, ax popa ; 弹出所有寄存器 add esp, 8 ; 弹出错误码和中断ID iret ; 从中断返回