Освой компьютер
Операционная система Amiga содержит функцию, с помощью
которой можно перейти в режим супервизора. Эта функция называется
SuperState (смещение -150 в exec.library) и не требует никаких параметров: ExecBase = 4
SuperState = -150
...
move.l ExecBase,A6 ;базовый адрес exec.library
jsr SuperState(A6) ;переходим в режим супервизора
move.l D0,savesp ;сохраняем точку возврата
...
savesp: blk.l 1 ;место для хранения точки
;возврата После вызова SuperState в D0 вовращается значение системного указателя
стека (SSP), а текущий указатель стека (SP) устанавливается на
пользовательский стек (USP). Это дает возможность работать с
пользовательским стеком в режиме супервизора.
Для возврата в режим пользователя используется функция UserState (смещение
-156 в exec.library), единственным параметром которой является значение
системного указателя стека, возвращенное функцией SuperState: UserState = -156
...
move.l execbase,A6 ;базовый адрес exec.library
move.l savesp(PC),D0 ;восстанавливаем стек (SSP)
jsr UserState(A6) ;возврат в режим пользователя
Таким образом можно писать подпрограммы, которые будут выполняться в
режиме супервизора. Для этого нужно: вызвать SuperState, сохранить
возвращенный указатель стека, выполнить нужные действия, вызвать UserState
и выполнить команду RTS.
Возникает вопрос: как работает команда SuperState? Каким образом
операционная система переходит в режим супервизора? Опишем этот механизм:
Подпрограмма SuperState делает попытку обращения к регистрам статуса. В
результате возникает исключение (по вектору $20), и происходит переход на
подпрограмму-обработчик в режиме супервизора. Эта подпрограмма выясняет,
что исключение вызвано обращением к регистрам статуса из функции
SuperState, и осуществляет возврат без перехода в режим пользователя. 8.2.
AMIGA: ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ.
|