Лабораторная работа 7 команды перехода
-
Цель работы
Изучение команд безусловных и условных переходов.
-
Безусловный переход
Команды машинной программы выполняются в том порядке, как они записаны в памяти. Команды перехода позволяют нарушить этот порядок. Команды безусловного перехода выполняются независимо от каких-либо условий. Команда перехода не меняет флаги.
Прямой безусловный переход: JMP <метка>
Операнд <метка> - метка команды, на которую надо передать управление:
ПРИМЕР
M: ADD AX, BX
JMP L ; переход «вперед»
...
L: MOV АХ, 0
JMP М ; переход «назад»
В машинной команде указывается не адрес перехода (метки), а разность адресов перехода и текущего (из регистра IP).
Если переход «назад», то величина разности при трансляции известна (подсчитывается), если «вперед» - формируется команда (3 байта) длинного перехода. Если заранее известно, что переход «вперед» будет коротким, и жалко терять байт на запись команды, используют оператор SHORT .
ПРИМЕР
JMP L ; длинный переход (3 байта)
JMP SHORT L ; короткий переход (2 байта)
...
L: ...
Если в программе указан оператор SHORT, а переход на самом деле оказался длинным, тогда Ассемблер зафиксирует ошибку.
-
Команды условного перехода
7.3.1 Если переход осуществляется только при выполнении некоторого условия, он называется условным.
Команды условного перехода: Jxx <метка>
<Метка> указывает команду, на которую надо сделать переход в случае выполнения некоторого условия, обозначенного хх.
7.3.2 При описании условия хх, при котором выполняется переход, используются следующие сокращения:
Е – equal (равно)
N - not (не - отрицание)
G – greater (больше)
для чисел со знаком
L – less (меньше)
А – above (выше, больше)
для чисел без знака
В – below (ниже, меньше)
7.3.3. Команды условного перехода делят на три группы:
-
ставятся после команды сравнения;
-
реагируют на значение определенного флага;
-
зависят от значения регистра СХ.
7.3.4 Команда сравнения
Сравнение (compare): CMP op1, op2
Операнды должны быть одного типа, их допустимые комбинации такие же, как у команд пересылки, сложения и вычитания (см. п 5.3).
Команда эквивалентна команде вычитания SUB op1, op2, но вычисленная разность op1 - op2 никуда не записывается. Разность, другими словами соотношение операндов, характеризуется величинами флагов CF, PF, AF, ZF, SF и OF.
Команды, используемые после сравнения, приведены в таблице 7.1.
Таблица 7.1 – Команды условного перехода группы а)
Мнемокод |
Содержательное условие для перехода после СМР ор1, ор2 |
для любых чисел |
|
JE |
op1 = op2 |
JNE |
op1 ≠ op2 |
для чисел со знаком |
|
JL / JNGE |
op1 < op2 |
JLE / JNG |
op1 ≤ op2 |
JG / JNLE |
op1 > op2 |
JGE / JNL |
op1 ≥ op2 |
для чисел без знака |
|
JB / JNAE |
op1 < op2 |
JBE / JNA |
op1 ≤ op2 |
JA / JNBE |
op1 > op2 |
JAE / JNB |
op1 ≥ op2 |
7.3.5 Команды, выполнение которых зависят от значений флагов, перечислены в таблице 7.2
Таблица 7.2 – Команды условного перехода группы b)
Мнемокод |
Условие перехода |
Мнемокод |
Условие перехода |
JZ |
ZF=1 |
JNZ |
ZF=0 |
JS |
SF=1 |
JNS |
SF=0 |
JC |
CF=1 |
JNC |
CF=0 |
JO |
OF=1 |
JNO |
OF=0 |
JP |
PF=1 |
JNP |
PF=0 |
Замечание: следующие пары мнемокодов эквивалентны: JE и JZ, JNE и JNZ.
ПРИМЕР
Протестировать состояние бита номер нуль регистра AL.
TEST AL, 00000001b
Результат операции – 00000001b (выполняется поразрядное умножение - and, но сам результат никуда не записывается, изменяется флаг нуля ZF).
Маска (шаблон) подобрана так, что все не интересующие нас биты в результате будут нулевыми (умножаются на нуль - 00000001b). Бит номер нуль в результате будет таким, каков он в регистре AL (он умножается на 1 - 00000001b).
Таким образом, весь результат фактически зависит от величины интересующего нас бита:
если бит =0, то результат =0 → ZF=1
если бит =1, то результат ≠0 → ZF=0
Программе доступен только флаг ZF. Именно его величина используется для организации условного перехода, например:
JZ bit0 – перейти на метку bit0, если ZF=1 (т.е. когда бит =0);
JNZ bit1 - перейти на метку bit1, если (not(ZF))=1, а значит ZF=0 (т.е. когда бит =1).
Эти логические цепочки позволяют на практике действовать следующим образом.
Команду JZ bit0 читаем:
прыгай (J – jump) на метку bit0, если бит (Z – zero) равен нулю.
Команду JNZ bit1 читаем:
прыгай (J – jump) на метку bit1, если бит (NZ – not zero) не равен нулю.
7.3.6 Одна команда, выполнение которой зависит от значения регистра СХ:
JCXZ <метка>
Переход выполняется, если регистр СХ равен нулю (jump if CX is zero).
7.3.7 С помощью команд условного перехода можно передать управление не далее, чем на 127-128 байтов вперед или назад. Это примерно 30-40 команд (в среднем одна команда занимает 3-4 байта). Для осуществления «дальних» условных переходов надо привлекать команду безусловного перехода.