global int_clock_handler [extern task_switch_next] ;CLOCK_COUNTER: ; db 0x00 [bits 32] int_clock_handler: cli ;Notice there is no IRQ number or error code - we don't need them ; inc byte [CLOCK_COUNTER] ; cmp byte [CLOCK_COUNTER], 0x2 ; 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 ;pop ebx ;compare: ;cmp eax,ebx ;jne compare mov esp, eax ;Replace the stack with what the C code gave us ; skip_clock: mov al, 0x20 ;Port number AND command number to Acknowledge IRQ out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts popa ;Put the standard registers back ;We didn't push an error code or IRQ number, so we don't have to edit esp now sti iretd ;Interrupt-Return