3.4. Регистры состояния и управления

В микропроцессоре присутствует несколько регистров, содержащих информацию о состоянии микропроцессора и программы, команды которой находятся в очереди команд (загружены на конвейер). К этим регистрам относятся счетчик команд IP(EIP), регистр флагов FL(EFL) и системные регистры.

Счетчик команд называется также командным указателем. Он связан с регистром сегмента кодов CS и содержит смещение на команду, которая должна быть выполнена. При выполнении команды значения счетчика увеличивается, за исключением тех случаев, когда команда относится к командам управления: перехода, цикла, вызова подпрограмм и возвращения из подпрограмм (включая программные прерывания).

Регистр флагов. Содержит 16(32) бит. Отдельные биты имеют определенное функциональное назначение и называются флагами. Различают три типа флагов: системные (они отражают текущее состояние компьютера в целом и чаще используются операционной системой, а не программами пользователя), флаги состояния (изменяются после каждой команды) и флаги управления. Формат регистра флагов приведен на рис.3.1. Отметим, что бит 1 регистра флагов всегда равен единице. Остальные неиспользованные для флагов биты равны нулю. Это относится, в частности к битам 22-31.

Рис. 3.1. Регистр флагов EFL

Напомним, что микропроцессор может работать в одном из трёх режимов: реальном, защищенном и в режиме V86.

Системные флаги

Флаг

Название

Бит

Назначение флага

ID

Флаг

идентификации

21

Для проверки, выполняет ли процессор команду CPUID. Если в программе можно установить и сбросить флаг ID, то команда CPUID данным процессором поддерживается. Эта команда предоставляет программисту информацию о продавце, модели и поколении данного процессора

VIP

Ожидание

виртуального прерывания

20

Флаг VIP, как и флаг VIF, позволяет каждой прикладной программе в многозадачном режиме иметь виртуальную версию флага IF

VIF

Виртуальное

прерывание

19

Этот флаг является виртуальным подобием флага IF и используется совместно с VIP

AC

Контроль

выравнивания

18

Предназначен для контроля выравнивания при обращениях к памяти. Используется совместно с битом AM  в системном регистре CR0. К примеру, Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам, кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию

Флаг

Название

Бит

Назначение флага

VM

Флаг

виртуального 8086

17

Признак работы микропроцессора в режиме виртуального 8086(V86):

1- процессор работает в режиме V86;

0- процессор работает в реальном или защищенном режиме

(Режим V86 является специальным подмножеством защищенного режима.)

RF

Флаг

возобновления

16

Флаг RF временно выключает обработку особых ситуаций отладки для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой IRETD при возврате в прерванную программу

IF

Флаг

прерывания

9

При IF=1 микропроцессор воспринимает и соответственно реагирует на запрос прерывания по входу INTR; при IF=0 прерывания по этому входу запрещаются. Значение флага IF не влияет на восприятие немаскируемых прерываний, выполняемых по команде INT. Устанавливается командой sti, сбрасывается с помощью cli

TF

Флаг

трассировки

8

При TF=1 микропроцессор переходит в пошаговый режим работы, при котором генерируется прерывание 1 после выполнения каждой команды. Флаг можно установить командами POPF, POPFD или IRET

Например:

sti ; разрешить прерывание

cli ; запретить прерывания

Флаги управления

Существует один флаг управления, он воздействует на циклические команды:

DF

Направление

10

Управляет направлением операций. Когда DF=0, циклы обрабатываются от младших адресов к старшим, а когда DF=1 – от старших к младшим. Флаг очищается с помощью команды CLD, устанавливается с помощью STD

Например,

std ; установить обратное направление обработки байт.

Флаги состояния

Флаг

Название

Бит

Название флага

NT

Флаг вложенности

задачи

14

Используется в защищенном режиме для фиксации того факта, что одна задача вложена в другую

IOPL

Уровень

привилегий

ввода/вывода

12-13

Используется в защищенном режиме для управления доступом к командам ввода/вывода, в зависимости от привилегированности задачи

Флаг

Название

Бит

Название флага

OF

Переполнение

11

Изменение старшего и знакового битов результата при переносе или заёме. Номера знакового и старшего битов равны: 7-6 при байтовых, 15-14 при

16-битовых и 31-30 при 32-битовых операциях

SF

Знак

7

Знаковый бит результата

ZF

Ноль

6

Устанавливается, если результат операции равен 0. Очищается, если результат ненулевой

AF

Вспомогательный

перенос

4

Применяется для работы с числами в BCD-формате. Устанавливается в 1, если в результате операции сложения был произведен перенос из бита 3 в бит 4, или при операции вычитания – заем из четвертого бита в бит 3. Иначе, при выполнении этих операций, бит AF очищается

PF

Паритет

(чётность)

2

Принимает значение 0, если сумма значений битов младшего байта результата нечётная, и 1 – если чётная

CF

Перенос

0

Устанавливается при переносе из знакового бита результата или при заёме в знаковый бит

Поясним на примерах, как устанавливаются флаги состояния в командах сложения и вычитания. Будем рассматривать операции над байтами.

Флаг PF. Устанавливается, если младший байт результата имеет чётное число ненулевых разрядов. В этом случае, при работе с отладчиком DEBUG в режиме трассировки, этот флаг будет выведен как PE(parity even), в противном случае PF=0 будет выведен как PO(parity odd).

Пример 1. После выполнения команд

mov    al,1

mov    bl,1

add    al,bl

значение PF будет равно 0 (PO). А после

mov    al,2

mov    bl,1

add    al,bl

значение PF будет равно 1(PE).

Флаг AF устанавливается при переносе из бита 3 в бит 4 и заёме из бита 4 в бит 3.

Пример 2. Рассмотрим команды

mov    al,1000b

mov    bl,1000b

add    al,bl

где xxxxb обозначает число в двоичном виде. После выполнения этих команд будет AF-1. А, например, при сложении чисел al = 4 и bl = 4, флаг AF очистится. При сложении чисел в столбик, справа налево, в случае, когда сумма цифр больше девяти, возникает ситуация, которая называется переносом из разряда, в котором находятся эти цифры. При вычитании чисел, если цифра первого числа больше цифры второго числа, возникает заём в разряд, к которому принадлежат эти цифры. Согласно описанию, флаг CF устанавливается при переносе знакового бита и заёме в знаковый бит.

Пример 3. Флаг CF будет установлен в следующем случае:

mov    al,110000000b

mov    bl,110000000b

add    al,bl

Поскольку был произведен перенос из знакового бита (и полученная сумма бит потеряла)

Для команды вычитания

sub    операнд1, операнд2

флаг CF устанавливается в случае заёма.

Пример 4. После выполнения команд

mov    al,0

sub    al,1

будут установлены флаги CF, AF, PF и SF.

Флаг OF устанавливается в следующем случае:

Пусть C15 (соответственно С7) означает событие переноса из знакового бита или заёма в знаковый бит, и пусть С14 (соответственно С6) – в старший бит из знакового. Мы видим, что в случаях С15 7) команда установит флаг с F. Флаг OF после выполнения команды становится равным сумме С1514 76) по модулю 2. В частности, если был перенос и из знакового бита, и из старшего бита, то OF станет равным 0.

В примере 3, несмотря на то, что CF=1, значение OF будет равно 0.

Пример 5. После команд

mov    al,10000000b

add    al,10000000b

Установятся оба флага CF=1 и OF=1.

Пример 6. После команд

mov    al,00b

add   al,11000000b

Установится флаг CF=1. А в случае

mov    al,10000000b

sub    al,00b

Установится флаг OF.

Таким образом, CF появляется при выходе результата за пределы слова (байта), а бит OF вычисляется по формуле:

OF=C7+C6 mod 2

Пример 7. Операции сложения и вычитания могут устанавливать также флаги SF и ZF. Например, после команд

mov    al,10b

add    al,10000000b

Флаги состояния будут иметь следующие значения: CF=1, PF=0, AF=0, ZF=0, SF=0, OF=1.

Пример 8. После команд

mov    al,10b

add    al,00111111b

Флаги состояния будут равны: CF=0, PF=0, AF=1, SF=1, OF=0

В заключение отметим, что команда сравнения CMP устанавливает флаги как команда вычитывания SUB, но записи результата в первый операнд не производит.

Пример 9. После команд

mov    al,00b

cmp    al,11000000b

Будут установлены флаги OF=1 и CF=1/

а после

mov    al,0

cmp    al,1

будут установлены флаги    AF=1, PF=1 и SF=1.

Заметим, что флаг CF можно установить командой STC или очистить с помощью CLC. Например,

stc    ; установить флаг CF

clc    ; очистить флаг CF