Как переключить задачу в прерывании? как переключить задачу в прерывании таймера? я пишу многопоточность в реальном режиме, уже сделал interrupt abuse и заменил прерывание таймера на свое. у меня есть массив из массивов (матрица, далее х и у).по оси х - потоки, а по оси у - все имеющиеся в процессоре регистры (в том числе сегментные). мне нужно сохранить текущее состояние процесса в массив по оси х (сохранить значения всех регистров), увеличить номер текущей задачи на единицу, загрузить регистры из следующего дескриптора и закончить прерывание. проблема в том, что я не знаю, как и в каком порядке загрузить регистры, чтобы случайно не сломать код (например, в каком порядке загрузить сегментные регистры?) и как получить состояние процессора в самом начале прерывания (я знаю, что где-то в стеке, но где - не знаю). кода на руках нет, но пишется все на fasm'e.
Для переключения задач в прерывании таймера на ассемблере (например, на FASM), вам необходимо сохранить состояние текущей задачи, загрузить состояние следующей задачи и завершить прерывание. Процесс сохранения и загрузки регистров зависит от архитектуры процессора (например, x86) и используемой операционной системы (например, Windows, Linux).
Обычно, чтобы сохранить состояние текущей задачи, вам нужно поместить значения регистров в стек. Для x86 архитектуры это можно сделать с помощью команды PUSHAD (для общих регистров) и команды PUSHFD (для регистра флагов). После сохранения состояния текущей задачи, вам нужно загрузить состояние следующей задачи из ее стека обратно в регистры с помощью команд POPAD и POPFD.
Чтобы правильно загрузить сегментные регистры, вы можете использовать команды POP для соответствующих сегментных регистров (например, POP ES, POP DS и т.д.). Также важно учесть правильный порядок выполнения команд загрузки регистров, чтобы избежать ошибок.
Чтобы получить состояние процессора в самом начале прерывания, можно обратиться к контексту прерывания, который обычно содержит информацию о регистрах и стеке. В зависимости от операционной системы, это может различаться, поэтому вам стоит изучить структуру контекста прерывания для вашей системы.
Надеюсь, эта информация поможет вам реализовать переключение задач в прерывании таймера на FASM.
Для переключения задач в прерывании таймера на ассемблере (например, на FASM), вам необходимо сохранить состояние текущей задачи, загрузить состояние следующей задачи и завершить прерывание. Процесс сохранения и загрузки регистров зависит от архитектуры процессора (например, x86) и используемой операционной системы (например, Windows, Linux).
Обычно, чтобы сохранить состояние текущей задачи, вам нужно поместить значения регистров в стек. Для x86 архитектуры это можно сделать с помощью команды PUSHAD (для общих регистров) и команды PUSHFD (для регистра флагов). После сохранения состояния текущей задачи, вам нужно загрузить состояние следующей задачи из ее стека обратно в регистры с помощью команд POPAD и POPFD.
Чтобы правильно загрузить сегментные регистры, вы можете использовать команды POP для соответствующих сегментных регистров (например, POP ES, POP DS и т.д.). Также важно учесть правильный порядок выполнения команд загрузки регистров, чтобы избежать ошибок.
Чтобы получить состояние процессора в самом начале прерывания, можно обратиться к контексту прерывания, который обычно содержит информацию о регистрах и стеке. В зависимости от операционной системы, это может различаться, поэтому вам стоит изучить структуру контекста прерывания для вашей системы.
Надеюсь, эта информация поможет вам реализовать переключение задач в прерывании таймера на FASM.