К о м а н д ы

п е р е д а ч и

у п р а в л е н и я

Команды передачи управления.

Команды передачи управления позволяют нарушить естественную последовательность выполнения команд.

  • Команды безусловной передачи управления:
    • JMP - Безусловная передача управления;
    • CALL - Вызов процедуры;
    • RET - Возврат из процедуры.
  • Команды условной передачи управления

Команды передачи управления НЕ меняют значения флагов.

Команда безусловного перехода JMP

Команда JMP LABEL осуществляет переход на указанную метку. Если заранее известно, что переход вперед делается на место, лежащее в диапазоне 128 байт от текущего места, можно использовать команду JMP SHORT LABEL. Атрибут SHORT заставляет Ассемблер сформировать короткую форму команды перехода, даже если он еще не встретил метку LABEL.

Тип перехода:
NEAR - переход в пределах сегмента.
FAR - межсегментный переход.

Логика работы:
NEAR: IP = IP + смещение
FAR:   CS = CODE2
           IP = IP + смещение

Команды условной передачи управления.

Команды условного перехода реализуют короткий переход, т.е. смещение в пределах [-128...127]. Если требуется переход дальше, нужно воспользоваться двумя командами Jcc и JMP.

Базовых команд условного перехода всего 17, но они могут иметь различную мнемонику (это команды-синонимы — для удобства чтения и понимания программы), поэтому получается 31 команда. Читать эти команды достаточно просто, если знаешь как формируются их имена.

Первая буква команды J от уже известного нам слова (Jump — прыжок). Остальные буквы (сс) в сокращенном виде описывают условие перехода.

  • Е — Equal (равно).
  • N — Not (не, отрицание).
  • G — Greater (больше) — применяется для чисел со ЗНАКОМ.
  • L — Less (меньше) — применяется для чисел со ЗНАКОМ.
  • А — Above (выше, больше) — применяется для чисел БЕЗ ЗНАКА.
  • В — Below (ниже, меньше) — применяется для чисел БЕЗ ЗНАКА.

Например, команда JL — переход, если меньше. Ей эквивалентна команда-синоним JNGE — переход, если НЕ больше и НЕ равно.

Условный переход обычно реализуется в два шага:

  • Сравнение (CMP), в результате чего формируются флаги;
  • Условная передача управления (Jcc Короткая_метка) на помеченную команду в зависимости от значения флагов.

Таким образом, в ассемблере реализуется условный оператор if.

Знаковые и беззнаковые данные.

Рассматривая назначение команд условного перехода следует пояснить характер их использования. Типы данных, над которыми выполняются арифметические операции и операции сравнения определяют какими командами пользоваться: беззнаковыми или знаковыми.

Беззнаковые данные используют все биты как биты данных; характерным примером являются символьные строки:имена, адреса и натуральные числа.

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

Многие числовые значения могут быть как положительными так и отрицательными.
В качестве примера предположим, что регистр AX содержит 11000110, а BX - 00010110.
Команда CMP AX,BX сравнивает содержимое регистров AX и BX. Если данные беззнаковые, то значение в AX больше, а если знаковые - то меньше.

Разница в командах перехода для знаковых и беззнаковых данных объясняется тем, что они реагируют на РАЗНЫЕ флаги (для знаковых данных существенен флаг SF, а для беззнаковыхCF).

Переходы для беззнаковых данных.

Мнемоника Описание Проверяемые флаги
JE/JZ Переход, если равно/нуль ZF
JNE/JNZ Переход, если не равно/не нуль ZF
JA/JNBE переход, если выше/не ниже или равно ZF, CF
JAE/JNB Переход, если выше или равно/не ниже CF
JB/JNAE Переход, если ниже/не выше или равно CF
JBE/JNA Переход, если ниже или равно/не выше CF, ZF

Любую проверку можно кодировать одним из двух мнемонических кодов. Например, JB и JNAE генерирует один и тот же объектный код, хотя положительную проверку JB легче понять, чем отрицательную JNAE.

Переходы для знаковых данных.

Мнемоника Описание Проверяемые флаги
JE/JZ Переход, если равно/нуль ZF
JNE/JNZ Переход, если не равно/не нуль ZF
JG/JNLE Переход, если больше/не меньше или равно ZF, SF, OF
JGE/JNL Переход, если больше или равно/не меньше SF, OF
JL/JNGE Переход, если меньше/не больше или равно SF, OF
JLE/JNG Переход, если меньше или равно/не больше SF, ZF, OF

Команды перехода для условия равно или ноль (JE/JZ) и не равно или не ноль (JNE/JNZ) присутствуют в обоих списках для беззнаковых и знаковых данных. Состояние равно/нуль происходит вне зависимости от наличия знака.

Специальные арифметические проверки.

Мнемоника Описание Проверяемые флаги
JS Переход, если есть знак(отрицательно) SF
JNS Переход, если нет знака (полоительно) SF
JC Переход, если есть перенос (аналогично JB) CF
JNC Переход, если нет переноса СF
JO Переход, если есть переполнение OF
JNO Переход, если нет переполнения OF
JP/JPE Переход, если паритет четный PF
JNP/JP Переход, если паритет нечетный PF

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

Промоделируем на Ассемблере простейшую задачу для 16-разрядных знаковых и беззнаковых данных:
unsigned int c1, d1;
int a1, b1;

if (a1 = b1) then Fsign = 0;
if (a1 < b1) then Fsign = -1;
if (a1 > b1) then Fsign = 1;

if (c1 = d1) then Fusign = 0;
if (c1 < d1) then Fusign = -1;
if (c1 > d1) then Fusign = 1;


;----------Знаковые_данные
mov Fsign, 0          ; a1 = b1
mov ax, a1
mov bx, b1
cmp ax,bx
JL Less
             ; a1 < b1
JG Great              ; a1 >b1
jmp Cont
Less: mov Fsign, -1
    ; a1 < b1
jmp Cont             ; a1 > b1
Great: mov Fsign,1

;----------Беззнаковые_данные
Cont: mov Fusign, 0    ; c1 = d1
mov ax, c1
mov bx, d1
cmp ax,bx
JB Below
             ; c1 < d1
JA Above               ; c1 >d1
jmp Exit
Below: mov Fusign, -1
   ; c1 < d1
jmp Exit
Above: mov Fusign,1
    ; c1 > d1
Exit: ret
primIF endp
end

Лабораторная работа №2

Программирование на Машинно-Ориентированных Языках.
Преподаватель: Коробов С.А.