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

       

Формат кода команды


Общая структура кодов большинства команд обработки данных микропроцессора 8086 следующая:

-----------¬ ----------¬ ------------¬ ---------------¬ ------------¬

¦ Prefixes ¦ ¦ Op Code ¦ ¦ ModRegR/M ¦ ¦ Displacement ¦ ¦ Immediate ¦

L----------- L---------- L------------ L--------------- L------------

Как видно из приведённого рисунка, код команды в общем случае состоит из пяти частей:

– префиксов (Prefixes) – 0–3 байта;

– кода операции (Op Code) – 1 байт;

– байта ModRegR/M – 1 байт;

– отклонения (Displacement) – 0–2 байта;

– непосредственного операнда (Immediate) – 0–2 байта.

В любой инструкции  присутствует код операции. Все остальные поля кода команды используются при возникновении такой необходимости. Длина кода команды колеблется от 1 до 9 байтов.

Инструкции переходов, использующие относительную адресацию, имеют следующий формат кода команды:

----------¬ ---------------¬



¦ Op Code ¦ ¦ Displacement ¦

L---------- L---------------

Код таких команд состоит из двух полей: однобайтового кода операции и отклонения длиной 1 или 2 байта в зависимости от используемой команды. Отклонение, рассматриваемое как число со знаком, прибавляется к содержимому указателя инструкции IP, который в этот момент указывает на команду, следующую за инструкцией перехода. В результате образуется адрес следующей команды.

Команды, использующие 8-разрядное отклонение, обеспечивают выполнение так называемых коротких переходов, а команды с 16-разрядным отклонением – длинных переходов. В любом случае переход является ближним (внутрисегментным).

Инструкции переходов, использующих прямую адресацию, имеют код команды размером 5 байт следующего формата:

----------¬ ---------¬ ----------¬

¦ Op Code ¦ ¦ Offset ¦ ¦ Segment ¦

L---------- L--------- L----------

Поля смещения (Offset) и селектора сегмента (Segment) занимают по два байта и вместе составляют адрес команды, на которую производится дальний (межсегментный) переход.

Формат инструкций перехода, использующих косвенную адресацию, сводится к общему формату команды обработки данных.
У них никогда не бывает поля непосредственного операнда, но всегда присутствует байт ModRegR/M; префиксы и отклонение могут присутствовать или отсутствовать. Если выполняется ближний (внутрисегментный) переход, т.е. если содержимое регистра CS не изменяется, смещение новой инструкции в текущем сегменте кода может содержаться либо в регистре общего назначения, либо в двухбайтовой области памяти, что определяется байтом ModRegR/M. Если же выполняется дальний (межсегментный) переход, то и новый селектор сегмента кода, и смещение находятся в четырёхбайтовой области памяти, адрес которой задаётся байтом ModRegR/M.

Некоторые инструкции имеют формат кода команды, отличающийся от вышеприведённых. Описание таких “нестандартных” форматов приводится при описании соответствующих инструкций.

Ниже более подробно рассматриваются компоненты кода команды обработки данных. Поля кодов инструкций переходов не рассматриваются, поскольку их назначение полностью ясно из приведённых выше рисунков и из описания в параграфе “Адреса переходов” подраздела 2.4.1 “Адресация операндов”.


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