CodeNet / Языки программирования / Ассемблер / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
Загружаем задачу
Прежде чем рассматривать этот раздел, советую ознакомится со структурой TTASK.
doStart8: mov al,[tasknum] inc al mov [tasknum],almov [cs:di],al ; Сохраним точку входа в дескрипторе задач mov [Word Ptr cs:di+1],100h mov [cs:di+3],esУвиличиваем количество задач.
; Подготовим оба стека 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Сохраним точку входа в дескрипторе задач ES:100h
mov [Word Ptr cs:di+9],1 ; Задаем приоритет задачи mov [Word Ptr cs:di+11],1 ; Задаем приоритет задачиЭмулируем рабочее состояние задачи, то есть подставляем ей все регистры, стек и флаги, то есть при переключении задач, новая - только что загруженая задача начнет работать именно с заданными регистрами.
Задаем приоритет задачи, 1 - нормальный.
Далее как ни в чем не бывало выходим из процудуры загрузки, новая задача запустится сама, когда придет ее очередь (см. переключение задач).