Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > hlt команда


Автор: rthsobakas 9.2.2008, 11:50
Читал в инете и в справочниках об этой команде и везде написано что она останавливает процессор. Зачем это нужно? приведите,пжл, пару примеров с её использованием(маленьких тока)...

Автор: PPS05 9.2.2008, 16:46
Имею мысль, что можно использовать при ожидании прерывания. А вот нужно ли?... 

Автор: rthsobakas 9.2.2008, 17:49
Код

Имею мысль, что можно использовать при ожидании прерывания. А вот нужно ли?... 

 мне тоже не совсем понятно зачем она нужна... Примеров не могу найти с ней, так бы может че понял

Автор: PPS05 9.2.2008, 18:36
Полазил по ссылкам в Гугле. Получается, что т.к. процессор приостанавливается можно его охладить. Вывести из hlt можно прерыванию, разрешенному до hlt.

Автор: rthsobakas 9.2.2008, 20:40
ну к примеру код
Код

.286
.model small
.code
    push    2h
    pop    cx
    mov    dl,0abh
 @1:    mov    ah,2
    int    21h
    rol    dl,1
    loopnz    @1
    hlt
    end

 но при выполнении exe выдает ошибку.

Автор: PPS05 10.2.2008, 15:28
Цитата(rthsobakas @  9.2.2008,  19:40 Найти цитируемый пост)
но при выполнении exe выдает ошибку.


А под какую систему запускается? В NT линейке hlt - привелигированная команда, недопустима в ring-3.

Автор: rthsobakas 11.2.2008, 15:27
на winXP запускаю

Цитата

В NT линейке hlt - привелигированная команда, недопустима в ring-3.


чето ниче не понял. Объясни поподробней , если не сложно

Автор: PPS05 11.2.2008, 18:26
В двух словах особо не объяснишь... На системах Windows 2000, 2003, NT, XP команда hlt входит в состав привелигированных, это значит, что прикладные программы не могут использоать hlt. Ей может пользоваться лишь ядро системы, которое имеет большие привилегия на выполнение кода.

Автор: Mikl_ 14.2.2008, 10:25
Семантика команды: остановка микропроцессора до прерывания или перезагрузки. 
Применение: 
В результате выполнения команды микропроцессор переходит в состояние остановки. Из этого состояния его можно вывести сигналами на входах RESET, NMI, INTR. Если для возобновления работы микропроцессора используется прерывание, то сохраненное значение пары CS:EIP/IP указывает на команду, следующую за HLT. Для иллюстрации применения данной команды рассмотрим способ переключения микропроцессора из защищенного в реальный режим и его возврата обратно в реальный режим. В микропроцессоре не предусмотрено специальных средств для подобного переключения. Сброс микропроцессора можно инициировать, если вывести байт со значением 0FEh в порт клавиатуры 64h. После этого микропроцессор переходит в реальный режим и управление получает программа BIOS, которая анализирует байт отключения в CMOS-памяти по адресу 0Fh. Если значения этого байта равно 05h — сброс микропроцессора инициирует инициализацию программируемого контроллера прерываний на значение базового вектора 08h. Далее управление передается по адресу, который находится в ячейке области данных BIOS 0040:0067h; 
Если значения этого байта равно 0Ah — сброс микропроцессора инициирует непосредственно передачу управления по адресу в ячейке области данных BIOS 0040:0067h (то есть без перепрограммирования контроллера прерываний). 
Если Вы не используете прерываний, то достаточно установить байт 0Fh в CMOS-памяти в 0Ah. Предварительно Вы должны инициализировать ячейку области данных BIOS 0040:0067h значением адреса, по которому необходимо передать управление после сброса. Для программирования CMOS-памяти используются номера портов 070h и 071h. Вначале в порт 070h заносится нужный номер ячейки CMOS-памяти, а затем в порт 071h — новое значение этой ячейки. 
;работаем в реальном режиме, готовимся к переходу в защищенный режим:
    PUSH ES
    PUSH 40h
    POP ES
    MOV WORD PTR ES:[67h],OFFSET RET_REAL;RET_REAL — метка в программе, с которой должно
;начаться выполнение программы после сброса
    MOV ES:[69h],CS
    MOV AL,0Fh ;будем обращаться к ячейке 0Fh в CMOS
    OUT 70h,AL
    NOP ;чуть задержимся, чтобы аппаратура отработала сброс без перепрограммирования контроллера
    MOV AL,0Ah
    OUT 71h,AL
;переходим в защищенный режим установкой бита 0 CR0=1 
. . .;работаем в защищенном режиме
;готовимся перейти обратно в реальный режим
    MOV AL,01FCh
    OUT 64h,AL ;сброс микропроцессора 
    HLT
;остановка до физического окончания процесса сброса
 RET_REAL: ... ;метка, на которую будет передано управление после сброса
Разработчики из фирмы Intel рекомендуют использовать команду HLT только тогда, кода возникает катастрофическая ошибка оборудования и дальнейшая работа бессмысленна.

Автор: MAKCim 14.2.2008, 15:40
Цитата(Mikl_ @  14.2.2008,  10:25 Найти цитируемый пост)
Разработчики из фирмы Intel рекомендуют использовать команду HLT только тогда, кода возникает катастрофическая ошибка оборудования и дальнейшая работа бессмысленна. 

применений больше

Автор: sgi1981 14.2.2008, 22:30
В остановленном состоянии микропроцессор потребляет мощность несколько ватт, а в исполняемом состоянии мощность несколько десятков ватт, вот поэтому есть смысл применять HLT.

Автор: Mikl_ 15.2.2008, 13:05
MAKCim
Я цитировал Юрова

Автор: AndNot 28.2.2008, 13:38
Извиняюсь за поднятие старой темы, просто вспомнился старый досовский трюк:
Код
Delay macro d
  local @@l
    mov cx, d
@@l:
    hlt
    loop @@l
endml
Самый короткий способ организации задержек (с дискретностью в 1/18 секунды) smile Правда со своими недостатками, поэтому не применим там, где неправильная задержка может нарушить логику программы.

Автор: MAKCim 28.2.2008, 15:10
AndNot, 
стремный способ
особенно если учесть, что кроме таймера есть еще куча всяких устройств  smile 

Автор: AndNot 1.3.2008, 20:37
MAKCim, 
Цитата(AndNot @  28.2.2008,  13:38 Найти цитируемый пост)
Правда со своими недостатками, поэтому не применим там, где неправильная задержка может нарушить логику программы
 ;) Я же не зря оговаривался. Но дос, есть дос, когда контролируешь почти все IRQ, то вполне можно применить. Использовал в небольших демонстрашках, где нужны были задержки (до нескольких секунд) и в то же время возможность прерывать их мышкой smile 
А вот старый способ самой короткой "вешалки": 
Код
    cli
    hlt
Под досом и Win9x работал безупречно, помогал лишь Reset. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)