Команды условных и безусловных переходов
Нарушение естественного порядка следования команд, когда адрес следующей выполняемой команды автоматически вычисляется программным счетчиком, осуществляется путем загрузки в программный счетчик и, при необходимости, в сегментный регистр CS новых адресов. Эти действия выполняются при помощи команд условных и безусловных переходов. Мнемоника этих команд начинается с символа J (jump).
Команды безусловного перехода имеют одну и ту же мнемонику JMP и дополнительную уточняющую информацию, определяющую дальность перехода. В командах безусловного перехода адрес новой команды может формироваться двумя способами. В первом способе в самой команде указывается смещение относительно текущей команды, которое может быть как положительным, так и отрицательным. Адрес, загружаемый в программный счетчик, образуется путем сложения с его текущим содержимым этого смещения, или его вычитания. Смещение может быть задано как однобайтным числом, так и двухбайтным. В первом случае переход называется коротким (SHORT), отстоящим от текущего адреса не более, чем на 127, во втором случае – близким (NEAR), т.е. находящимся в одном сегменте с текущим адресом, напомним, что объем одного сегмента – 216 = 64 Кбайт.
Во втором способе адрес новой исполняемой команды непосредственно загружается в программный счетчик. При этом он может быть взят из команды в виде двухбайтного числа, или из ячейки памяти, адрес которой указан в команде всеми возможными режимами адресации. Второй способ обеспечивает переход не только внутри текущего сегмента программы, но и в любой другой. Для этого новый адрес загружается не только в программный счетчик, но и в сегментный регистр CS. Он может быть задан либо вторым двухбайтным словом, содержащимся в команде, либо содержимым двух ячеек ОЗУ, находящихся следом за ячейками с внутрисегментным адресом для программного счетчика. Такой переход называют далеким (FAR).
При транслировании команд с языка Ассемблер в машинные коды дальность перехода и тип определяются либо дополнительной информацией – SHORT, NEAR или FAR, либо размером адреса (одно-, двух-, четырехбайтный). Очень часто в качестве адреса в команде дается ссылка на метку, которой помечена команда, к которой осуществляется переход:
JMP SHORT NEXT.
По этой команде адрес следующей исполняемой команды определится как сумма текущего с однобайтным смещением. Расчет смещения выполняет ассемблирующая программа по отстоянию текущей команды от команды, помеченной меткой NEXT:
JMP FAR [DI]+100.
Эта команда определяет межсегментный переход. Адреса, загружаемые в программный счетчик и регистр CS, содержатся в четырех соседних ячейках ОЗУ. Адрес первой из них определяется как содержимое регистра DI плюс смещение 100.
Команды условных переходов имеют только один способ определения адреса перехода – как смещение, не более чем ±127 относительно текущего адреса. В этих командах осуществляется проверка различных условий выполнения перехода. Порядок действия МП при выполнении команды условного перехода следующий: если условие, заданное в команде, выполняется, то следующий адрес вычисляется путем сложения (вычитания) текущего содержимого программного счетчика со смещением; если же условие не выполняется, то автоматически сформированный адрес и есть адрес следующей команды. Таким образом, сохраняется естественный порядок следования команд и Вперед команда стоит непосредственно за командой условного перехода.
Мнемоника команд условного перехода начинается с символа J. Затем идут символы, определяющие проверяемое условие. Проверка условий осуществляется путем анализа различных флажков – битов регистра слова состояния процессора, хранящих признаки результата предыдущей операции. Таким образом, непосредственно перед командой условного перехода обязательно должна стоять команда, с помощью которой формируются признаки результата. У одной части команд осуществляется анализ только одного признака результата – одного бита регистра флажков, у другой двух или трех битов.
Приведем мнемоники некоторых команд с их наименованиями и необходимыми пояснениями.
JZ – "Перейти, если ноль" – переход осуществляется, если результат предыдущей операции равен нулю.
JNZ – "Перейти, если не ноль" – команда противоположна команде JZ
JS – "Перейти, если знаковый бит равен 1" – переход выполняется, если результат вычитания двух операндов отрицателен.
JNS – "Перейти, если знаковый бит равен 0" – переход выполняется, если результат вычитания положителен.
В следующих четырех командах осуществляется проверка условий, соответствующих математическим операторам отношений <, >, >, <. Эти команды предназначены для использования после команды сравнения СМР, в которой второй операнд вычитается из первого, а результат операции не сохраняется.
JL – "Перейти, если меньше".
JNL – "Перейти, если больше".
JLE – "Перейти, если меньше или равно".
JNLE – "Перейти, если больше или равно".
Команды условного перехода обычно имеют следующий обобщенный вид:
Мнемоника Метка, например JLE NEXT.
В данном примере NEXT – это метка команды, которую следует выполнить в случае выполнения условия. Она должна находиться не далее чем на ±127 относительно команды условного перехода. При трансляции ассемблирующая программа вычислит соответствующее смещение и поместит его в машинную команду. Если команда, которой следует передать управление, находится дальше или в другом сегменте, то используют конструкцию из двух команд: условного и безусловного перехода. Сначала проверяется условие с помощью команды условного перехода, которая дает ссылку на команду безусловного перехода, находящуюся вблизи ее. Затем по команде безусловного перехода осуществляется переход к нужному участку программы в любую точку памяти.
Команды ввода-вывода. Все внешние устройства рассматриваются микропроцессором как внешние регистры или порты ввода-вывода. Для передачи данных между МП и ВУ имеются две команды: IN– ввод и OUT– вывод. Весь процесс обмена ведется через регистр АХ или его отдельные половины. Он является как бы "почтовым ящиком". Через него осуществляются пересылки данных из МП в ВУ и в него же данные принимаются. Обобщенный вид команд можно представить в следующем виде:
Мнемоника Приемник, Источник.
В команде IN в качестве приемника может выступать регистр АХ (АН, AL). В качестве источника должен выступать адрес регистра ВУ, который может быть задан либо однобайтной константой (от 0 до 255), либо косвенно, путем указания регистра DX. В этом случае в этот регистр должен быть занесен двухбайтный адрес регистра ВУ. В команде OUT регистр АХ теперь выступает уже в качестве источника, а адрес регистра ВУ должен быть помещен на место приемника. Он может быть задан так же, как и в команде IN.
В команде IN АХ, 40 приемником является АХ, а источником – регистр с адресом 40.
В команде OUT DX, AL приемником является регистр с адресом, содержащимся в DX, а источником – регистр AL.
Кроме рассмотренных команд в МП Intel 8086 имеются команды для работы со стеком – записи в стек и извлечения из стека; команды для организации циклических программ; команды для установки и сброса отдельных признаков результата – флажков; команды, обеспечивающие управление микропроцессором.