Типы данных, над которыми выполняются арифметические операции и операции сравнения, определяют, какими командами пользоваться: беззнаковыми или знаковыми. Беззнаковые данные используют все биты как биты данных; характерным примером являются символьные строки: имена, адреса и натуральные числа. В знаковых данных самый левый бит представляет собой знак (см. лаб.раб. №5). Многие числовые значения могут быть как положительными, так и отрицательными.
В качестве примера предположим, что регистр AX содержит 11000110, а BX - 00010110. Команда CMP AX,BX сравнивает содержимое регистров AX и BX. Если данные беззнаковые, то значение в AX больше, а если знаковые - то меньше.
Таблица 7.1. Переходы для беззнаковых данных
Мнемоника | Описание | Проверяемые флаги |
JE/JZ | Переход, если равно/нуль | ZF |
JNE/JNZ | Переход, если не равно/не нуль | ZF |
JA/JNBE | Переход, если выше/не ниже или равно | ZF,CF |
JAE/JNB | Переход, если выше или равно/не ниже | CF |
JB/JNAE | Переход, если ниже/не выше или равно | CF |
JBE/JNA | Переход, если ниже или равно/не выше | CF,AF |
Любую проверку можно кодировать одним из двух мнемонических кодов. Например, JB и JNAE генерирует один и тот же объектный код.
Таблица 7.2. Переходы для знаковых данных
Мнемоника | Описание | Проверяемые флаги |
JE/JZ | Переход, если равно/нуль | ZF |
JNE/JNZ | Переход, если не равно/не нуль | ZF |
JG/JNLE | Переход, если больше/не меньше или равно | ZF,SF,OF |
JGE/JNL | Переход, если больше или равно/не меньше | SF,OF |
JL/JNGE | Переход, если меньше/не больше или равно | SF,OF |
JLE/JNG | Переход, если меньше или равно/не больше | ZF,SF,OF |
Команды перехода для условия равно или ноль (JE/JZ) и не равно или не ноль (JNE/JNZ) присутствуют в обоих списках для беззнаковых и знаковых данных. Состояние равно/нуль происходит вне зависимости от наличия знака.
Таблица 7.3. Специальные арифметические проверки
Мнемоника | Описание | Проверяемые флаги |
JS | Переход, если есть знак (отрицательно) | SF |
JNS | Переход, если нет знака (положительно) | SF |
JC | Переход, если есть перенос (аналогично JB) | CF |
JNC | Переход, если нет переноса | CF |
JO | Переход, если есть переполнение | OF |
JNO | Переход, если нет переполнения | OF |
JP/JPE | Переход, если паритет четный | PF |
JNP/JP | Переход, если паритет нечетный | PF |
Еще одна команда условного перехода проверяет, равно ли содержимое регистра CX нулю. Эта команда необязательно должна располагаться непосредственно за командой арифметики или сравнения. Одним из мест для команды JCXZ может быть начало цикла, где она проверяет, содержит ли регистр CX ненулевое значение.
Запомните, что для беззнаковых данных есть переходы по состояниям равно, выше или ниже, а для беззнаковых - равно, больше или меньше. Переходы по проверкам флагов переноса, переполнения и паритета имеют особое назначение. Ассемблер транслирует мнемонические коды в объектный код, независимо от того какую из двух команд вы применили. Однако, команды JAE и JGE являясь явно одинаковыми, проверяют различные флаги.