Hm, in Assembler müsste das so aussehen:
task_ss equ 0x10
task_esp equ 0x70000
task_eflags equ 0x3202
task_cs equ 0x8
task_eax equ 0
task_ebx equ 0
task_ecx equ 0
task_edx equ 0
task_esi equ 0
task_edi equ 0
task_ebp equ 0
; 1024 elemente großen stack erstellen
[section .bss]
resd 1024
task_stackbase:
[section .text]
; erstellt einen neuen task
; erwartet den eip in eax
; und gibt den sp des kernelstacks in eax zurück
create_new_task:
; später solltest du den speicher für den stack dynamisch allokieren
mov [task_stackbase - 4], task_ss
mov [task_stackbase - 8], task_esp
mov [task_stackbase - 12], task_eflags
mov [task_stackbase - 16], task_cs
mov [task_stackbase - 20], eax
mov [task_stackbase - 24], task_eax
mov [task_stackbase - 28], task_ebx
mov [task_stackbase - 32], task_ecx
mov [task_stackbase - 36], task_edx
mov [task_stackbase - 40], task_esi
mov [task_stackbase - 44], task_edi
mov [task_stackbase - 48], task_ebp
mov eax, task_stackbase - 48
ret
task_switch_isr:
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
; scheduler aufrufen und nächsten task bestimmen
; dann esp switchen
; eoi senden
mov al, 0x20
out 0x20, al
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
iret
btw, bei ring0 tasks wird kein SS und ESP auf den stack gepusht (und vom iret auch nicht gepopt), wenn ein interrupt eintritt. Wenn der Ring nicht gewechselt wird, ändert sich der ESP auch nicht beim Interrupt.