Команды переходов
Команды переходов подразделяются на команды безусловных переходов и
условных переходов. Команды безусловных переходов обеспечивают переход на соответствующую команду программы. Этот оператор по своему функциональному назначению соответствует оператору языка Паскаль.
GOTO <метка>
Форматы команд безусловных переходов:
JMP<смещение>- смещение рассматривается как знаковое целое, которое прибавляется с расширением знака до 16 бит к содержимому IP (в IP содержится адрес команды, находящейся после команды JMP);
JMP<адрес>- содержит 4 байта прямого адреса перехода;
JMP mem/reg - реализует косвенный безусловный переход.
Команды условных переходов анализируют некоторое условие, закодированное текущим состоянием флажков, при этом в зависимости от того, удовлетворено условие или нет, переход либо совершается, либо нет. Эти команды позволяют проверить оба состояния практически всех флажков арифметических операций, а также ряд комбинаций состояний нескольких флажков. Если условие истинно, управление передаётся по адресу перехода, если ложно - выполняется следующая по порядку команда. Ниже приводится таблица, в которой перечислены команды условных переходов. Команды условных переходов удобно рассматривать в соответствии со следующей классификацией:
· команды условных переходов для беззнаковых данных;
· команды условных переходов для знаковых данных;
· специальные арифметические проверки.
Употребление терминов "больше" и "меньше" относят к знаковым числам, представленным в дополнительном коде, а "выше" и "ниже" к беззнаковым. Например, число ACh меньше и выше числа 43h. Каждая команда условного перехода имеет две мнемоники, при этом обе мнемоники генерируют одинаковый код. Введение двух мнемонических обозначений одной команды объясняется необходимостью обеспечения определённых удобств для программиста.
Таблица команд условных переходов
№/№ | Мнемоника | Проверяемое условие | Проверяемые флаги |
Команды перехода для беззнаковых данных | |||
JE /JZ | равно / нуль | z | |
JNE / JNZ | не равно / не нуль | z | |
JA / JNBE | выше / не ниже или равно | z,c | |
JAE / JNB | выше или равно / не ниже | c | |
JB / JNA | ниже / не выше или равно | c | |
JBE /JNA | ниже или равно / не выше | c,a | |
Команды перехода для знаковых данных | |||
JE / JZ | равно / нуль | z | |
JNE / JNZ | не равно / не нуль | z | |
JG / JNLE | больше / не меньше или равно | z,s,o | |
JGE / JNL | больше или равно / не меньше | s,o | |
JL / JNGE | меньше / не больше или равно | s,o | |
JLE / JNG | меньше или равно / не больше | z,s,o | |
Специальные арифметические проверки | |||
JS | есть знак (отрицательное) | s | |
JNS | нет знака (положительное) | s | |
JC | есть перенос | c | |
JNC | нет переноса | c | |
JO | есть переполнение | o | |
JNO | нет переполнения | o | |
JP / JPE | паритет чётный | p | |
JNP / JPO | паритет не чётный | p |
Кроме перечисленных в таблице команд, в число команд условных переходов входит команда JCXZ, которая проверяет, равно ли нулю содержимое регистра CX, и, если равенство подтверждается, совершается переход.