В микропроцессоре присутствует несколько регистров, содержащих информацию о состоянии микропроцессора и программы, команды которой находятся в очереди команд (загружены на конвейер). К этим регистрам относятся счетчик команд 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 после выполнения команды становится равным сумме С15+С14 (С7+С6) по модулю 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