CF (Carry Flag) — флаг переноса
Содержит значение «переносов» (0 или 1) из старшего разряда при арифметических операциях и некоторых операциях сдвига и циклического сдвига.
PF (Parity Flag) — флаг четности
Проверяет младшие восемь бит pезультатов операций над данными. Нечетное число бит приводит к установке этого флага в 0, а четное — в 1. Не следует путать флаг четности с битом контроля на четность.
AF (Auxiliary Carry Flag) — дополнительный флаг переноса
Устанавливается в 1, если арифметическая операция приводит к переносу четвертого справа бита (бит номер 3) в регистровой однобайтовой команде.Данный флаг имеет отношение к арифметическим операциям над символами кода ASCII и к десятичным упакованным полям.
ZF (Zero Flag) — флаг нуля
Устанавливается в качестве результата aрифметических команд и команд сравнения. Как это ни странно, ненулевой результат приводит к установке нулевого значения этого флага, а нулевой — к установке единичного значения. Кажущееся несоответствие является, однако, логически правильным, так как 0 обозначает «нет» (то есть, результат не равен нулю), а единица обозначаeт «да» (то есть, результат равен нулю).
Команды условного перехода JE и JZ проверяют этот флаг.
SF (SIgn Flag) — знаковый флаг
Устанавливается в соответствии со знаком результата (старшего бита) после арифметических опеpаций: положительный результат устанавливает 0, а отрицательный — 1. Команды условного перехода JG и JL проверяют этот флаг.
TF (Trap Flag) — флаг пошагового выполнения
Этот флаг вам уже приходилось устанавливать, когда использовалась команда Т в отладчике DEBUG. В случае, если этот флаг установлен в единичное cостояние, то процессор переходит в режим пошагового выполнения команд, то есть, в каждый момент выполняется одна команда под пользовательским управлением.
IF (Interrupt Flag) — флаг прерывания
При нулевом состоянии этого флага прерывания запрещены, при единичном — разрешены.
DF (DIrection Flag) — флаг направления
Используется в строковых операциях для определения направления передачи данных. При нулевом состоянии команда увеличивает содержимое регистров SI и DI, вызывая передачу данных слева направо, при нулевом — уменьшает содержимое этих регистров, вызывая передачу данных справа налево.
OF (Overflow Flag) — флаг переполнения
Фиксирует арифметическое переполнение, то есть, перенос вниз старшего (знакового) бита при знаковых арифметических операциях.
В качестве примера: команда CMP сравнивает два операнда и воздействует на флаги AF, CF, OF, PF, SF, ZF. Однако, нет необходимости проверять все эти флаги по отдельности. В следующем примере проверяется содержит ли регистр BX нулевое значение:
CMP BX,00 ;Сравнение BX с нулем
JZ B50 ;Переход на B50 если нуль
...
действия не при нуле
...
B50: ... ;Точка перехода при BX=0
В случае, если BX содержит нулевое значение, команда CMP устанавливает флаг нуля ZF в единичное состояние, и возможно изменяет (или нет) другие флаги.
Команда JZ (переход, если нуль) проверяет только флаг ZF. При единичном значении ZF, обозначающее нулевой признак, команда передает управление на адрес, указанный в ее операнде, то есть, на метку B50.
Команды условного перехода
Команда LOOP уменьшает на единицу содержимое регистра CX и проверяет его: если не ноль, то управление передается по адресу, указанному в операнде. Таким образом, передача управления зависит от конкретного состояния. Ассемблер поддерживает большое количество команд условного перехода, которые осуществляют передачу управления в зависимости от состояний флагового регистра. Например, при сравнении содержимого двух полей последующий переход зависит от значения флага.
Команду LOOP в программе можно заменить на две команды: одна уменьшает содержимое регистра CX, а другая выполняет условный переход:
LOOP A20
DEC CX
JNZ A20
Команды DEC и JNZ действуют аналогично команде LOOP: уменьшают содержимое регистра CX на 1 и выполняет переход на метку A20, если в CX не ноль. Команда DEC кроме того устанавливает флаг нуля во флаговом регистре в состояние 0 или 1. Команда JNZ затем проверяет эту установку. В рассмотренном примере команда LOOP хотя и имеет ограниченное использование, но более эффективна, чем две команды: DEC и JNZ.
Аналогично командам JMP и LOOP операнд в команде JNZ cодержит значение расстояния между концом команды JNZ и адресом A20, которое прибавляется к командному указателю. Это расстояние должно быть в пределах от -128 до +127 байт.
В случае перехода за эти границы Ассемблер выдаст сообщение:
«Relative jump out of range» (превышены относительные границы перехода)