Изменил немного сборку в стеке для прерывания задачи, запуска задачи и усыпления задачи: flg, cs, eip, eax, ecx, edx, ebx, ebp, esi, edi, cr3, esp
Варианты использования:
если запускаем задачу: flg=0, cs, eip(адрес функции), eax, ecx, edx, ebx, ebp(объект), esi, edi(адрес возврата), cr3, esp(прошлое задание)
если прерываем: flg, cs, eip(адрес возврата), eax, ecx, edx, ebx, ebp(объект), esi, edi, cr3, esp(прошлое задание)
если задача прервана, и к ней же добавлена задача:
flg=0, cs, eip(адрес функции), eax, ecx, edx, ebx, ebp(объект), esi, edi(адрес возврата), cr3, esp(прошлое задание) - задана задача и она выпоняется
работа с обнулением стека в конце и выход с обнулёным стеком
flg, cs, eip(адрес возврата), eax, ecx, edx, ebx, ebp(объект), esi, edi, cr3, esp(прошлое задание) - прервана задача
flg=0, cs, eip(адрес функции), eax, ecx, edx, ebx, ebp(объект), esi, edi(адрес возврата), cr3, esp(прошлое задание) - задача после которой возобновится
работа с обнулением стека в конце и выход на восстановление прошлой
прервынная работа
Запуск из просмотра прироста к стеку:
Код:
pop edi esi ebp edx ecx ebx eax
cmp dword[esp+8],0 ;если запуск а не восстановление
jnz .0
add esp,12
jmp dword[esp-12]
.0: add esp,8
popfd
jmp dword[esp-12]
Запуск из прерывания:
Код:
mov eax,[ebp+68]
add esp,4
;pop eax
mov cr3,eax
pop edi esi ebp edx ecx ebx eax
cmp dword[esp+8],0 ;если перед восстановлением добавили задачу
jnz .1
mov edi,[flg]
mov [esp+12],edi
.1: iretd
При возникновении прерывания процессор запрещает прерывания if, а iretd разрешает
Цель реализации работы объектов в своём стеке и многозадачности:
1 Запускать задачи из своего стека
2 Усыплять задачи
3 Переключать задачи
4 Останавливать задачи
5 Добавлять задачу к имеющейся