Конспект лекций Системное программирование (семестр 2) Возле названия каждой лекции написано число пар, в течение которых она будет читаться (+ ср обозначает

Вид материалаКонспект
Схема команды
Состояние флагов после выполнения команды
См. также
Состояние флагов после выполнения команды
См. также
Подобный материал:
1   ...   13   14   15   16   17   18   19   20   ...   57

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:       ...     ;метка, на которую будет передано

                        ;управление после сброса

        

См. также: уроки 15, 16, 17

IDIV


(Integer DIVide)

Деление целочисленное со знаком

 

Схема команды: 

idiv делитель 

Назначение: операция деления двух двоичных значений со знаком.

Синтаксис

Алгоритм работы:

Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде:
  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx;

Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов (старших разрядов) делимого и делителя.

Состояние флагов после выполнения команды:

11

07

06

04

02

00

OF

SF

ZF

AF

PF

CF

?

?

?

?



?

Применение:

Команда выполняет целочисленное деление операндов с учетом их знаковых разрядов. Результатом деления являются частное и остаток от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

;деление слов

        mov     ax,1045 ;делимое

        mov     bx,587  ;делитель

        cwd             ;расширение делимого dx:ax

        idiv    bx      ;частное в ax, остаток в dx

        

См. также: урок 8, приложение 7 и команду div