Базовая регистровая архитектура процессоров семейства Х86, страница 3

 Указатель команд (инструкций) в командах прямо не указывается, но он обязательно участвует во всех командах передачи управления, к которым относятся команды условных и безусловных переходов, вызова подпрограмм, возврата из подпрограмм и др. В операциях с регистром EIP участвуют двойные слова, а в операциях с регистром IP – слова.

 Для сведения, несколько забегая вперед, отметим, что современный процессор из памяти выбирает не по одной команде. Он осуществляет опережающую выборку выровненных 16  байтных (в МП 80386 и i486) или 32 байтных (в МП типа Pentium) блоков. (4 последовательных слова по 32 разряда в первом случае и 4 последовательных слова по 64 разряда – во втором). Отметим, что в том и другом случае, размер этих слов соответствует емкости строк соответствующей внутренней кэш-памяти. Напомним также, что выровненный 16 байтный блок всегда должен выбираться по адресу с нулевыми 4 младшими битами, а выровненный 32 байтный блок – с 5 нулевыми младшими битами. Таким образом, при выполнении перехода или вызова процессор выбирает целый выровненный блок по указанному адресу назначения.

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

Регистр флагов EFLAFGS/FLAGS (рис.II.2) содержит флаги, которые можно разделить на флаги состояния (NT, OF, SF, ZF, AF, PF, CF) и флаги управления (ID, VIP, VIF, AC, VM, RF, DF, IF, TF, IOPL).

Флаги состояния сообщают об особенностях результата выполнения команд обработки данных. Команды условных переходов позволяют программе учесть состояние этих флагов и отреагировать на них. Команды простой пересылки данных не воздействуют на флаги состояния. Флаги состояния OF, SF, ZF, AF, PF, CF называют, кроме того, арифметическими флагами, поскольку они отражают ту или иную особенность результата арифметической или логической команды.

     Рис.II.2. Распределение флагов в регистре EFLAGS/FLAGS.

Рассмотрим правила установки флагов состояния более подробно.

CF (Carry Flag) – флаг переноса. Устанавливается в 1, если арифметическая операция вызвала перенос (при операции сложения) из старшего бита результата, или заем (при операции вычитания). В противном случае флаг сбрасывается в 0. В зависимости от разрядности операнда, старшим битом может являться бит 7 (байты), 15 (слова) или 31 (двойные слова). Флаг CF может также изменять свое состояние при сдвиговых операциях.  С помощью специальных команд этот флаг можно установить в любое состояние или инвертировать его. Используется процессором в основном при исполнении команд условных переходов и при сдвиговых операциях. При арифметических операциях с целыми беззнаковыми числами служит признаком переполнения разрядной сетки. Кроме того, процессор использует этот флаг при обработке многоразрядных чисел, с разрядностью, превышающей разрядность сумматора арифметико-логического устройства (АЛУ).

PF (ParityFlag) – флаг паритета (четности). Флаг устанавливается в 1, если младший байт результата содержит четное число единичных бит; в противном случае флаг устанавливается в состояние 0. Используется процессором при исполнении команд условных переходов, а также для контроля четности/нечетности при передаче данных.

AF (AuxiliaryCarryFlag) – флаг дополнительного переноса. Устанавливается в 1, если арифметическая операция вызвала перенос (при сложении) из первой тетрады младшего байта результата, или заем (при вычитании). В противном случае флаг устанавливается в 0. Используется процессором при операциях десятичной арифметики: при AF=1 процессор вводит коррекцию в полученный результат. Программно этот флаг недоступен.

ZF (ZeroFlag) – флаг нулевого результата. Устанавливается в состояние 1, когда результат операции равен 0; в противном случае он сбрасывается в 0. В операциях сравнения ZF устанавливается в 1, когда сравниваемые операнды равны, так как операция сравнения производится с помощью вычитания операндов. Используется процессором при выполнении операций условных переходов.

SF (SignFlag) – флаг знака результата. Устанавливается в то же состояние, в каком находится старший байт результата. В зависимости от разрядности операндов этим битом может быть бит 7, 15 или 31. При использовании целых чисел со знаком, представляемых в дополнительном коде, флаг SF показывает знак результата. Используется процессором при выводе результатов операций, а также при исполнении команд условных переходов.

OF (OverflowFlag) – флаг переполнения разрядной сетки. Флаг OF устанавливается в 1, если при арифметических операциях с целыми знаковыми операндами результат превышает диапазон представления чисел; в противном случае флаг OF устанавливается в 0. Этот флаг введен потому, что при знаковых операндах, установление флага CF в 1 не может служить критерием переполнения разрядной сетки (также как и установка флага ОF в состояние 1 еще не может служить признаком переполнения разрядной сетки при операциях с беззнаковыми целыми числами). Значение флага OF определяется логической функцией неравнозначности сигналов переноса в старший (знаковый) бит результата и из старшего бита. В зависимости от размера операндов старшим битом может являться бит 7, 15 или 31. Флаг OF используется процессором при контроле правильности выполнения арифметических операций и исполнении команд условных переходов.

NT (NestedTask) – флаг вложенной задачи. Этот флаг действует только в защищенном режиме (Р – режиме) и устанавливается в 1, когда текущая задача производит переключение на другую задачу с помощью команды вызова CALL. Таким образом, с помощью этого флага организуется цепь вложенных задач аналогично вложению подпрограмм. Состояние флага NT  проверяется процессором при выполнении команды возврата из прерывания IRET и при NT = 1 осуществляется переключение задачи, а при NT = 0 происходит обычный возврат из прерывания.