Адресация в переходах
а) Прямая адресация.
Команда содержит в себе базовый адрес сегмента и смещение. Это допускается только в командах межсегментного перехода или вызова процедур. Метка, которой передается управление, должна иметь атрибут FAR.
JMP CATS
где CATS – метка команды или имя процедуры.
б) Косвенная адресация
Адрес перехода содержится в регистре или ячейке памяти. Это допускается для межсегментных и внутрисегментных переходов.
JMP AX ; в АХ заранее помещен перехода
JMP NEAR COD[BX]
Во втором примере есть явное указание типа перехода (NEAR – оператор в команде), COD[BX] – базовая адресация команды, которой передается управление.
в) Относительная адресация
Место перехода указывается как некоторое расстояние от самой команды перехода. Эффективный адрес перехода вычисляется суммированием индекса смещения, находится в команде и текущего значения указателя команд IP.
Имеется 2 типа:
1) с 1Б индексным смещением, обеспечивает передачу управления в диапазоне (-128:128Б) (SHORT)
2) с 2Б индексным смещением
(-32 768:32768Б) от текущей команды NEAR
Операндом является метка с атрибутом NEAR, по которой ассемблер автоматически вычисляет значение. В команде может быть указан тип перехода:
mov w, offset L1; (в ячейку w записывается смещение L1 относительно текущей команды offset – смещение)
JMP w или JMP SHORT w
Команды условных переходов
Делятся на 2 группы:
а) операторы, анализирующие результаты предыдущей команды (флаги) – условный переход в классическом понимании. Они имеют только 1-байтовое смещение.
Если условный переход требует удаление более чем на 128Б (30-40 команд), то используется комбинация условного и безусловного перехода.
Например:
Требуется NEAR переход на метку ZERO по флагу ZF=1, тогда
………..
JNZ CONTINUE; if ZF<>1 then continue
JMP ZERO
CONTINUE
Т.е. используется условный переход по противоположному признаку, а по ZF=1 получим 2-хбайтовый переход.
Мнемоника условного перехода сложна, таких переходов более 20. Некоторые очевидны. Для образовании мнемоники используют следующие сокращения:
E – equal (=)
N – not (не)
G – больше для знаковых целых
L – меньше для знаковых целых
A – above (выше) беззнаковых
B –below (ниже) для беззнаковых
В условных переходах используется после J от одной до трех букв (из перечисленных выше).
Например, после сравнения чисел результат ор1<ор2, возможны 2 команды, эквивалентные между собой для одного и того же перехода.
- Для знаковых JL ADRES
JMGE ADRES
- Для беззнаковых JB ADRES
JNA ADRES
б) команды управления циклом
LOOP ор
Управление циклом по счетчику, где ор – метка первой команды цикла, цикл управляется счетчиком в СХ.
Команда LOOP уменьшает содержимое СХ (dec СХ) и передает управление в начало цикла, если содержимое СХ<>0, иначе управление передается команде следующей за LOOP.
Обычно цикл оформляется следующим образом.
mov CX,N ; СХ = числу переходов цикла
L1: ……… начало цикла
……………….
LOOP L1;
Команда LOOP эквивалентна 3-м командам:
Dec CX
Cmp CX, 0
Jne L1
Особенности команды LOOP:
- счетчик цикла находится только в CX;
- начальное значение загружается в CX>0 до входа в цикл;
- команды прохода цикла выполняются хотя бы один раз;
- LOOP осуществляет переход типа SHORT, поэтому проход цикла не должен занимать ³128Б (»30-40 команд); если нужен более длинный проход цикла, то используется сочетание условных и безусловных переходов;
- CX может использоваться как операнд в цикле, но не должен изменяться другими командами.
Есть и другие команды управления циклом.
Например, команды перехода по циклу с дополнительным условием, а именно с учетом флага ZF. Можно использовать 2 эквивалентные записи:
LOOPE op
LOOPZ op
Здесь цикл повторяется CX раз, пока сохраняется ZF=1, что соответствует сложному условию передачи управления CX<>0 AND ZF=1.
Эти команды управления циклом обычно используются для решения задач поиска в последовательностях, их основной недостаток состоит в том, что неочевидна причина выхода их цикла, и требуется дополнительный анализ по окончании цикла.