CodeNet / Языки программирования / Ассемблер / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
Загружаем задачу
Прежде чем рассматривать этот раздел, советую ознакомится со структурой TTASK.
doStart8: mov al,[tasknum]
inc al
mov [tasknum],al
Увиличиваем количество задач.
mov [cs:di],al
; Сохраним точку входа в дескрипторе задач
mov [Word Ptr cs:di+1],100h
mov [cs:di+3],es
Сохраним точку входа в дескрипторе задач ES:100h
; Подготовим оба стека
mov [Word Ptr es:0FFFEh],00000h ; 0 - если программа
; закончится RET'ом, то CS:IP=CS:0000, а там int 20h
mov [Word Ptr es:0FFFCh],00232h ; FLAGS
mov [Word Ptr es:0FFFAh],es ; CS PSP
mov [Word Ptr es:0FFF8h],00100h ; IP 100h
mov [Word Ptr es:0FFF6h],00111h ; DI 0000
mov [Word Ptr es:0FFF4h],00222h ; BX 0000
mov [Word Ptr es:0FFF2h],00333h ; AX 0000
mov [Word Ptr es:0FFF0h],es ; ES PSP
mov [Word Ptr es:0FFEEh],es ; DS PSP
mov [Word Ptr es:0FFECh],00000h ; SI 0000
mov [Word Ptr cs:di+513],0FFECh ; SS FFEC
mov [Word Ptr cs:di+511],ES ; SP seg
mov [Word Ptr cs:di+509],00000h ; CX 0000
mov [Word Ptr cs:di+507],00000h ; DX 0000
mov [Word Ptr cs:di+505],00000h ; BP 0000
Эмулируем рабочее состояние задачи, то есть подставляем ей все регистры,
стек и флаги, то есть при переключении задач, новая - только что загруженая
задача начнет работать именно с заданными регистрами.
mov [Word Ptr cs:di+9],1 ; Задаем приоритет задачи
mov [Word Ptr cs:di+11],1 ; Задаем приоритет задачи
Задаем приоритет задачи, 1 - нормальный.
Далее как ни в чем не бывало выходим из процудуры загрузки, новая задача запустится сама, когда придет ее очередь (см. переключение задач).
