HLT
(HaLT)
Остановка
Схема команды: | hlt |
Назначение: остановка микропроцессора до прерывания или перезагрузки.
Алгоритм работы:
перевод микропроцессора в состояние остановки.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
В результате выполнения команды микропроцессор переходит в состояние остановки. Из этого состояния его можно вывести сигналами на входах RESET, NMI, INTR. Если для возобновления работы микропроцессора используется прерывание, то сохраненное значение пары cs:eip/ip указывает на команду, следующую за hlt. Для иллюстрации применения данной команды рассмотрим еще один способ переключения микропроцессора из защищенного в реальный режим и его возврата обратно в реальный режим (см. урок 16). Как известно, в микропроцессоре не предусмотрено специальных средств для подобного переключения. Сброс микропроцессора можно инициировать, если вывести байт со значением 0feh в порт клавиатуры 64h. После этого микропроцесор переходит в реальный режим и управление получает программа BIOS, которая анализирует байт отключения в CMOS-памяти по адресу 0fh. Для нас интерес представляют два значения этого байта — 5h и 0ah:
5h — сброс микропроцессора инициирует инициализацию программируемого контроллера прерываний на значение базового вектора 08h (см. уроки 15 и 17). Далее управление передается по адресу, который находится в ячейке области данных BIOS 0040:0067;
0ah — сброс микропроцессора инициирует непосредственно передачу управления по адресу в ячейке области данных BIOS 0040:0067 (то есть без перепрограммирования контроллера прерываний).
Таким образом, если вы не используете прерываний, то достаточно установить байт 0fh в CMOS-памяти в 0ah. Предварительно, конечно, вы должны инициализировать ячейку области данных BIOS 0040:0067 значением адреса, по которому необходимо передать управление после сброса. Для программирования CMOS-памяти используются номера портов 070h и 071h. Вначале в порт 070h заносится нужный номер ячейки CMOS-памяти, а затем в порт 071h — новое значение этой ячейки.
;работаем в реальном режиме, готовимся к переходу ;в защищенный режим: push es mov ax,40h mov es,ax mov word ptr es:[67h],offset ret_real ;ret_real — метка в программе, с которой должно ; начаться выполнение программы после сброса mov es:[69h],cs mov al,0fh ;будем обращаться к ячейке 0fh в CMOS out 70h,al jmp $+2 ;чуть задержимся, чтобы аппаратура отработала ;сброс без перепрограммирования контроллера mov al,0ah out 71h,al ;переходим в защищенный режим установкой ;бита 0 cr0 в 1 (см. урок 16) ;работаем в защищенном режиме ;готовимся перейти обратно в реальный режим mov al,01fch out 64h,al ;сброс микропроцессора hlt ;остановка до физического окончания процесса сброса ret_real: ... ;метка, на которую будет передано ;управление после сброса |