![]() |
|
|
Для того, чтобы вернуть процессор 80286 из защищённого режима в реальный, необходимо выполнить аппаратный сброс (отключение) процессора. Это можно сделать следующим образом: mov ax, 0FEh ; команда отключения out 64h, ax Перед выдачей команды отключения необходимо запомнить содержимое регистра SP, так как после передачи управления по адресу, записанному в области данных BIOS 0040h:0067h, регистры SS:SP будет указывать на стек BIOS. После выдачи команды отключения надо подождать, когда произойдёт сброс процессора. Это можно сделать, выдавая в цикле команду HLT. Вот фрагмент программы, возвращающий процессор в реальный режим:
; Запоминаем содержимое указателя стека, так как после
; сброса процессора оно будет потеряно
mov [real_sp],sp
; Выполняем сброс процессора
mov al,SHUT_DOWN
out STATUS_PORT,al
; Ожидаем сброса процессора
wait_reset:
hlt
jmp wait_reset
Далее необходимо восстановить содержимое сегментных регистров, записанное в оперативную память на этапе подготовки к переключению в защищённый режим, закрыть адресную линию A20 и размаскировать прерывания. Для закрытия линии A20 можно воспользоваться следующей процедурой:
;--------------------------------------------------
; Процедура закрывает адресную линию A20
;--------------------------------------------------
PROC disable_a20 NEAR
mov al,A20_PORT
out STATUS_PORT,al
mov al,A20_OFF
out KBD_PORT_A,al
ret
ENDP disable_a20
Следующая последовательность команд размаскирует все прерывания: mov ax,000dh ; разрешаем немаскируемые прерывания out CMOS_PORT,al in al,INT_MASK_PORT ; разрешаем маскируемые прерывания and al,0 out INT_MASK_PORT,al sti Теперь, когда мы знаем всё, что нужно для переключения процессора в защищённый режим и возврата в реальный режим, можно приступить к практической работе в защищённом режиме.
|
|
|