Реклама:

В последней группе табл. В.2. представлены команды условного и безусловного переходов, вызова подпрограмм и возврата. Простейшей из них является команда JMP.

Метка в ней может указывать на целевой адрес или на содержимое любого действительного адреса. Следует учитывать различие между ближним и дальним переходами. Объектом ближнего перехода является текущий кодовый сегмент, неизменный в период выполнения операции. В процессе дальнего перехода значение регистра CS, напротив, меняется. В случае непосредственной адресации с применением метки новое значение регистра кодового сегмента устанавливается при вызове после метки; в случае с действительным адресом из памяти выбирается длинное слово, в результате младшее слово оказывается соответствующим целевой метке, а старшее слово - новому значению регистра кодового сегмента.

Ничего удивительного в таком различии нет. Чтобы выполнить переход к произвольному адресу в 20-разрядном адресном пространстве, необходим механизм определения адреса длиной более 16 бит. Этот механизм существует, и заключается он в присвоении регистрам CS и PC новых значений.

Условные переходы

В процессоре 8088 предусмотрены 15 разновидностей условных переходов, причем у некоторых из них сразу несколько имен (например, команды JUMP GREATER OR EQUAL и JUMP NOT LESS THAN эквивалентны). Все они перечислены в табл. В.З. Максимальное расстояние перехода составляет 128 байт от текущей команды. Если объект перехода находится вне допустимого диапазона, приходится реали-зовывать составной переход (JumP over JumP)- В этом случае для перехода через следующую команду применяется второй переход с противоположным условием. Если в следующей команде определен безусловный переход по целевому адресу, то сочетание этих двух команд приводит лишь к удлинению перехода указанного типа. К примеру:

JВ FARLABEL

Эту команду следует заменить следующей конструкцией:

JNA If

JMP FARLABEL

1:

Иными словами, если выполнение команды JUMP BELOW невозможно, составляется конструкция, состоящая из команды JUMP NOT ABOVE с близлежащей меткой 1 в качестве объекта и безусловного перехода к FARLABEL. Результаты в обоих случаях одинаковы, различие заключается лишь в больших или меньших временных и пространственных затратах. Если объект перехода находится слишком далеко, ассемблер автоматически организует составной переход. Правильно провести подобные вычисления довольно сложно. Предположим, что расстояние до объекта близко к максимально допустимому, и при этом некоторые промежуточные команды содержат условные переходы. Внешний переход может быть проведен только после определения расстояний внутренних переходов. В такой ситуации ассемблер предпринимает определенные меры предосторожности. К примеру, он может сформировать составной переход без строгой на то необходимости. Непосредственный условный переход формируется ассемблером только в том случае, если объект перехода совершенно точно находится на досягаемом расстоянии.

Таблица В.З- Условные переходы

Команда

Описание

Условие перехода

JNA, JBE

Ниже или равно

CF = 1 или ZF = 1

JNB, JAE, JNC

Не ниже

CF = 0

JE, JZ

Нуль, равно

ZF= 1

t@tabl_body -= JNLE, JG

Больше чем

SF = OF и ZF = 0

JGE, JNL

Больше или равно

SF = OF

JO

Переполнение

OF= 1

JS

Отрицательный знак

SF = 1

JCXZ

Значение СХ равно нулю

cx = o

JB, JNAE, JC

Ниже

CF= 1

JNBE, JA

Выше

CF = 0 и ZF = 0

JNE, JNZ

Не равно нулю, не равно

ZF = 0

JL, JNGE

Меньше чем

SF*OF

JLE, JNG

Меньше или равно

SF ф OF или ZF = 1

JNO

Без переполнения

OF = 0

JNS

Неотрицательно

SF = 0

В большинстве своем условные переходы зависят от флагов состояния и предваряются командами сравнения или проверки. Команда СМР вычитает исходный операнд из целевого операнда, устанавливает коды состояния, после чего сбрасывает результат. Ни один из операндов при этом не меняется. При нулевом результате или установленном знаковом бите (обозначающем отрицательный результат) устанавливается соответствующий флаговый бит. Если результат не представляется возможным выразить допустимым числом битов, устанавливается флаг переполнения. Если старший бит сопровождается переносом, устанавливается флаг переноса. При условных переходах все эти биты можно проверить.

Для обработки операндов со знаками используются команды GREATER THAN и LESS THAN. Операнды без знаков обрабатываются командами ABOVE и BELOW.

Операции организации циклов и повторяющиеся строковые операции || Оглавление || Вызовы подпрограмм