Ассемблер. Условия

  Светлана Деменева  | 

  Обновл. 16 Ноя 2019  | 

 450

К условиям в ассемблере относятся инструкции циклов и ветвления. Эти инструкции могут изменять поток выполнения кода в программе.

Типы прыжков

Есть 2 типа выполнения условий в ассемблере:

   Прыжок без условия (или ещё «безусловный прыжок») — выполняется инструкцией JMP. Выполнение данной инструкции часто включает передачу управления в адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Результатом передачи управления может быть выполнение нового набора инструкций или повторное выполнение текущих инструкций.

   Прыжок с условием (или ещё «условный прыжок») — выполняется с помощью инструкций типа J<условие> и зависит от самого условия. Условные инструкции, изменяя значение смещения в регистре IP, передают управление, прерывая последовательный поток выполнения кода.

Прежде чем разбираться с этими двумя типами инструкций детальнее, давайте рассмотрим инструкцию CMP.

Инструкция CMP


Инструкция CMP (от англ. «COMPARE») сравнивает два операнда. Фактически, она выполняет операцию вычитания между двумя операндами для проверки того, равны ли эти операнды или нет. Используется вместе с инструкцией условного прыжка.

Синтаксис инструкции CMP:

CMP назначение, источник

Инструкция CMP сравнивает два числовых поля. Операнд назначения может находиться либо в регистре, либо в памяти. Исходным операндом (источник) могут быть константы, регистры или память.

Например:

Инструкция CMP часто используется для проверки того, достигла ли переменная-счётчик максимального количества раз выполнения цикла или нет.

Например:

Прыжок без условия

Как мы уже говорили, безусловный прыжок выполняется инструкцией JMP, которая включает в себя имя метки, куда следует перебросить точку выполнения программы:

JMP    label

В следующем примере мы рассмотрим использование инструкции JMP:

Прыжок с условием


Если в условном прыжке выполняется указанное условие, то точка выполнения программы переносится в указанную инструкцию. Существует множество инструкций условного прыжка в зависимости от условия и данных.

Ниже приведены инструкции условного прыжка, используемые для данных со знаком в арифметических операциях:

Инструкция Описание Тестируемые флаги
JE/JZ Jump Equal (равно) или Jump Zero (ноль) ZF
JNE/JNZ Jump Not Equal (не равно) или Jump Not Zero (не ноль) ZF
JG/JNLE Jump Greater (больше) или Jump Not Less/Equal (не меньше/равно) OF, SF, ZF
JGE/JNL Jump Greater/Equal (больше/равно) или Jump Not Less (не меньше) OF, SF
JL/JNGE Jump Less (меньше) или Jump Not Greater/Equal (не больше/равно) OF, SF
JLE/JNG Jump Less/Equal (меньше/равно) или Jump Not Greater (не больше) OF, SF, ZF

В следующей таблице приведены инструкции условного прыжка, используемые для данных без знака в логических операциях:

Инструкция Описание Тестируемые флаги
JE/JZ Jump Equal (равно) или Jump Zero (ноль) ZF
JNE/JNZ Jump Not Equal (не равно) или Jump Not Zero (не ноль) ZF
JA/JNBE Jump Above (больше) или Jump Not Below/Equal (не меньше/равно) CF, ZF
JAE/JNB Jump Above/Equal (больше/равно) или Jump Not Below (не меньше) CF
JB/JNAE Jump Below (меньше) или Jump Not Above/Equal (не больше/равно) CF
JBE/JNA Jump Below/Equal (меньше/равно) или Jump Not Above (не больше) AF, CF

Следующие инструкции условного прыжка имеют специальное использование и проверяют значение флагов:

Инструкция Описание Тестируемые флаги
JCXZ Jump если CX равно Zero none
JC Jump если Carry (перенос) CF
JNC Jump если No Carry (нет переноса) CF
JO Jump если Overflow (переполнение) OF
JNO Jump если No Overflow (нет переполнения) OF
JP/JPE Jump Parity или Jump Parity Even (если чётность) PF
JNP/JPO Jump No Parity или Jump Parity Odd (если нечётность) PF
JS Jump Sign (отрицательное значение) SF
JNS Jump No Sign (положительное значение) SF

Пример синтаксиса набора инструкций типа J<условие>:

В качестве примера, рассмотрим следующую программу, которая определяет и выводит на экран наибольшую из трёх целочисленных переменных:

Результат выполнения программы выше:

The largest digit is:
47

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *