pushf ;пихаем в стек флаги
mov ax,11100b
push ax ;cs
mov eax,next_task_link
push eax ;eip
iret
переключение задач в PM через IRET
Делаю переключение задачи с помощью IRET, пишу так:
Код:
На команде iret происходит исключение. режим: PM, код 16-разрядный.
Помогите, плиз, найти ошибку!
P.S. а команда pushf пихает в стек flags или eflags?
Цитата:
mov eax,next_task_link
push eax ;eip
push eax ;eip
EAX или AX? Что-то я не понимаю.
Цитата:
режим: PM, код 16-разрядный.
pushf пихает flags, pushfd - eflags
Нигде в документации не сказано, что для переключения задач можно использовать команду iret с селектором задачи в стеке!!! iret помимо своего прямого назначения может использоваться лишь при выходе из вложенной задачи (в этом случае селектор новой задачи должен находиться в поле tss.backlink текущей).
Есть 32-разрядный код одной задачи, он делает int 31h
Есть 16-разрядный код другий задачи, он тоже делает int 31h
int 31h - вызывыется через шлюз прерывания.
Мне надо узнать eip и eflags сначала одной задачи (32 разаряда), потом после переключения по таймеру вторая задача (16 разрядов) вызывает тот же int 31h из неё тоже надо вытянуть eip и eflags.
Как я понмаю из 32-х разрядного кода int делетает следующее:
pushfd
push cs
push eip
а 16-и разрядный:
pushf
push cs
push ip
Вопрос: как мне заставить int в 16-разрядном коде делать pushfd и push eip?
Если шлюз прерывания 32-разрядный, то в стек будут помещаться двойные слова.
Огромное спасибо!