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» (превышены относительные границы перехода)

Наши рекомендации