Описание процессора i8086 для программиста

Адреса переходов


Различают переходы ближние (near, внутрисегментные) и дальние (far, межсегментные). Ближний переход осуществляется всегда в пределах текущего сегмента кода, т.е. содержимое регистра CS не изменяется. Дальний переход осуществляется в другой сегмент, т.е. при его выполняется изменяется содержимое не только указателя инструкции IP, но и регистра сегмента кода CS.

Инструкции безусловного перехода JMP и перехода к подпрограмме CALL

позволяют выполнять как ближние, так и дальние переходы. При ближних переходах используется относительная или косвенная адресация, при дальних – прямая или косвенная. Инструкции условных переходов и циклов осуществляют только ближние переходы, используя относительную адресацию.

При относительной адресации

код команды содержит в своём составе 8- или 16-разрядное отклонение.

Если переход происходит (т.е. если использована инструкция CALL

или JMP

либо если в инструкции условного перехода или цикла условие перехода соблюдается), отклонение складывается с адресом команды, расположенной сразу за данной инструкцией перехода, и полученная сумма заносится в регистр указателя инструкции IP. Значение селектора сегмента кода, находящееся в регистре CS, не изменяется. Таким образом, происходит переход относительно адреса команды, расположенной за инструкцией перехода, откуда данный вид адресации и получил своё название.

Команда JMP позволяет использовать 8- и 16-разрядные отклонения, что позволяет осуществлять переход либо в пределах от –128 до +127, либо от –65536 до –65535 байтов относительно следующей инструкции в пределах одного и того же сегмента. Первые переходы носят название коротких, вторые – длинных[3]. Команда CALL

использует только 16-разрядные отклонения. Инструкции условных переходов и циклов используют 8-разрядные отклонения. Таким образом, расстояние условного перехода оказывается весьма ограниченным, что иногда приводит к повышенному расходу памяти из-за необходимости использования пары команд – условного и безусловного перехода.


Часто отклонение, используемое при относительной адресации, называют смещением. Однако это может привести к путанице, поскольку термин “смещение” при программировании для микропроцессора 8086 используется в первую очередь для обозначения одной из двух частей логического адреса (см. подраздел 2.2.2 “Сегментация”). Термин “отклонение”, правда, тоже используется – для обозначения одного из компонентов эффективного адреса операнда, расположенного в памяти (см. параграф “Операнды в памяти” этого подраздела), однако значение этого термина оказывается в данном случае ближе к относительной адресации, поскольку и в том, и в другом случае отклонение фактически показывает, на сколько байтов в ту или иную сторону отстоит адресуемая ячейка от базового адреса, т.е. адреса следующей инструкции в команде относительного перехода или суммы содержимого регистров, используемых при формировании эффективного адреса операнда[4].

При прямой адресации код команды содержит полный адрес следующей выполняемой команды в формате “сегмент : смещение”, причём сначала располагается смещение, а потом – селектор сегмента. Прямая адресация используется инструкциями JMP

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

Прямая адресация получила своё название в связи с тем, что в коде инструкции находится сам адрес перехода.

При косвенной адресации, доступной только инструкциям CALL и JMP, возможно выполнение как ближних, так и дальних переходов. В коде команды задаётся либо регистровый операнд (только для ближнего перехода), либо операнд в памяти (для ближнего или дальнего перехода), причём способ определения этого операнда не отличается от принятого для команд обработки данных (см. параграфы “Регистровые операнды” и “Операнды в памяти” этого подраздела).

Если выполняется ближний переход, то операнд является новым значением указателя инструкции IP, т.е. определяет смещение следующей выполняемой команды в текущем сегменте кода. Это смещение находится либо в регистре общего назначения (регистровый операнд), либо в слове памяти по заданному адресу (операнд в памяти).

Если выполняется дальний переход, адрес следующей инструкции занимает два слова памяти: в первом хранится смещение, а во втором – селектор сегмента, которые загружаются соответственно в регистры IP и CS. Сама команда перехода задаёт адрес первого их этих слов (операнд в памяти).

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


Содержание раздела