bits 32 global syscall_isr global quit_isr global yield_isr global _start_user_mode extern syscall_table extern active_task extern delete_task extern advance_active_task n_syscalls equ 8 section .text syscall_isr: cmp eax, n_syscalls jge .bad mov eax, dword [syscall_table + eax * 4] push edi push esi push edx push ecx push ebx call eax add esp, 20 iret .bad: mov eax, -1 iret quit_isr: push dword [active_task] call delete_task push yield_isr.return_to_task jmp advance_active_task yield_isr: mov eax, dword [active_task] mov dword [eax + 8], ebx mov dword [eax + 12], ecx mov dword [eax + 16], edx mov dword [eax + 20], esi mov dword [eax + 24], edi mov dword [eax + 28], ebp mov edx, dword [esp] mov dword [eax], edx mov edx, cr3 mov dword [eax + 4], edx mov edx, dword [esp + 12] mov dword [eax + 4], edx call advance_active_task .return_to_task: mov eax, dword [active_task] mov edx, dword [eax] mov dword [esp], edx mov edx, dword [eax + 4] mov cr3, edx mov edx, dword [eax + 4] mov dword [esp + 24], edx mov ebx, dword [eax + 8] mov ecx, dword [eax + 12] mov edx, dword [eax + 16] mov esi, dword [eax + 20] mov edi, dword [eax + 24] mov ebp, dword [eax + 28] _before_start_task: iret _start_user_mode: push dword 0x2b sub esp, 4 push dword 0x00000200;interrupt flag push dword 0x23 sub esp, 4 jmp yield_isr.return_to_task