.global pit_init .global pit_interrupt_handler .global pit_get_ticks ticks: .int 0 pit_get_ticks: mov (ticks),%eax ret pit_interrupt_handler: // increase tick counter push %eax mov $ticks, %eax incl (%eax) pop %eax //// pusha //Push all standard registers mov %esp, %eax //save current stack pointer (pointing to registers!) movl $stack_top, %esp //use stack from multiboot.s(16Kb) // call our scheduler passing it the old stack addres (pointing to pushed registers (pusha)) push %eax call task_switch_next // the scheduler returned the new stack pointer (after taskswitch) mov %eax, %esp //Replace the stack with what the C code gave us // acknowlege irq mov $0x20,%al out %al,$0x20 popa //Put the standard registers back iret pit_init: // configure ticking 25 times a second // 1193180 / 25 = 47727.2 mov $47727, %dx mov $0b00110100, %al outb %al,$0x43 mov %dx,%ax out %al, $0x40 xchg %ah,%al out %al, $0x40 ret