global int_clock_handler [extern task_switch_next] CLOCK_COUNTER: db 0x00 [bits 32] int_clock_handler: ;Notice there is no IRQ number or error code - we don't need them inc byte [CLOCK_COUNTER] cmp byte [CLOCK_COUNTER], 0x10 jne skip_clock mov byte [CLOCK_COUNTER], 0x00 pusha ;Push all standard registers push esp ;Push pointer to all the stuff we just pushed call task_switch_next ;Call C code mov esp, eax ;Replace the stack with what the C code gave us popa ;Put the standard registers back skip_clock: mov al, 0x20 ;Port number AND command number to Acknowledge IRQ out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts ;We didn't push an error code or IRQ number, so we don't have to edit esp now iret ;Interrupt-Return