struc PCB .PID resd 1 ; Offset: 0 .STATE resd 1 ; Offset: 4 .KSTACK resd 1 ; Offset: 8 .CONTEXT resd 1 ; Offset: 12 .TF resd 1 ; Offset: 16 .FLAGS resd 1 ; Offset: 20 .NEXT resd 1 ; Offset: 24 .PAGE_DIRECTORY resd 1 ; Offset: 28 endstruc ; void switchProcess(Process* next) section .text global switchProcess extern current extern trapret ; void switchProcess(Process* next_process_ptr) switchProcess: mov edx, [esp + 4] ; edx = next_process_ptr (получаем аргумент СРАЗУ) cli ; Запретить прерывания push ebp push ebx push esi push edi mov eax, [current] mov [eax + 4], esp ; current->kesp = esp ; edx уже содержит next_process_ptr mov esp, [edx + 4] ; esp = next_process_ptr->kesp mov [current], edx ; current = next_process_ptr mov eax, [edx + 40] mov cr3, eax pop edi pop esi pop ebx pop ebp ret trapret: ; Восстанавливаем общие регистры из trap frame ;popal ; edi, esi, ebp, oesp, ebx, edx, ecx, eax ; Восстанавливаем сегментные регистры pop gs pop fs pop es pop ds popad ; Пропускаем trapno и err add esp, 8 ; trapno (4 байта) + err (4 байта) ; Теперь ESP указывает на eip, cs, eflags, esp, ss iret