; C ISR routine [extern isr] ; Macro for creating a single ISR label ; We need to push a junk value on the stack first ; if the interrupt number is not 8 or 10-14. ; This is to properly align the stack for both exceptions ; having and not having error codes. %macro isr_label 1 [global isr_%1] isr_%1: %if ( (%1 != 8) && (%1 < 10 || %1 > 14) ) push eax ; junk value to take error code stack space %endif pusha ; eax, ecx, edx, ebx, esp, ebp, esi, edi mov al, %1 ; save interrupt number in al %if ($ - isr_common) < 127 ; do a short jump and save 3 bytes if we can jmp short isr_common %else jmp isr_common %endif %endmacro ; The common ISR routine isr_common: push ds push es push fs push gs push esp ; pointer to interrupt stack push eax ; interrupt number call isr pop eax ; restore stack pointer (this is shorter pop eax ; than "add esp, 8" and "lea esp, [esp+8]") pop gs pop fs pop es pop ds popa ; edi, esi, ebp, , ebx, edx, ecx, eax lea esp, [esp+4] ; bypass error code iret ; Loop to create all of our ISR entry points %assign i 0 %rep 50 isr_label i %assign i i+1 %endrep