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

 

Несколько типичных форматов команд микропроцессора 8086 приведены на Рис. 7.16. Длина команд варьируется от одного до 6 байт. Длина смещений и непосредственных данных может быть 8 или 16 бит в зависимости от команды. В первых одном или двух байтах команды находятся код операции и указание режима адресации. После них могут находиться:

ни одного дополнительного байта;

двухбайтный ЕА (только для прямой адресации);

одно- или двухбайтное смещение;

одно- или двухбайтный непосредственный операнд;

одно- или двухбайтное смещение с последующим одно- или двухбайтным непосредственным операндом;

двухбайтное смещение и двухбайтный сегментный адрес (только для прямой межсегментной адресации).

 

Рис. 7.16. Примеры форматов команд микропроцессора 8086

 

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

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

Бит W. Если команда может оперировать байтом и словом, в коде операции имеется бит W, который определяет операцию с байтом ( W = 0) или словом (W=l).

Бит D. Содержится в двухоперандных командах (за исключением команд с непосредственным операндом и цепочечных команд, которые рассматриваются в гл. 5). Одним из операндов должен быть регистр, определяемый полем REG. В таких командах бит D показывает, чем является регистр: операндом-источником (D = 0) или операндом-получателем (D = 1).

Бит S. 8-битное число в дополнительном коде можно расширить до 16-битного в дополнительном коде, если сделать все биты старшего байта равными старшему биту младшего байта. Такая операция называется расширением знака (или расширением со знаком). Бит S появляется вместе с битом W в командах сложения, вычитания и сравнения с непосредственным операндом и расшифровывается следующим образом:

8-битная операция — S:W = 00;

16-битная операция с 16-битным непосредственным операндом- S:W = 01; 16-битная операция с 8-битным операндом, который расширяется со знаком до 16 бит, - S:W =11.

При небольших числах последний вариант допускает использовать однобайтный непосредственный операнд.

Рис. 7.17. Адреса регистров

Бит V. Применяется в командах сдвигов для определения числа сдвигов.

Бит Z. Используется в команде REP.

Сегментный регистр определяется двумя битами, а любой другой регистр — тремя. Адреса регистров (т.е. двоичные обозначения их) приведены на Рис. 7.17. Неоднозначности использования, например, 00 для указания сегментного регистра ES и 000 для указания регистров АХ и AL не возникает, так как нужный регистр подразумевается кодом операции.

Если на код операции и режим адресации отводятся два байта, второй байт имеет одну из следующих двух форм:

Первая из них предназначена для однооперандных команд (или двухоперандных, в которых один из операндов неявно определяется кодом операции) . Вторая форма характерна для двухоперандных команд, причем поле REG определяет регистр, который в зависимости от значения бита D является операндом-источником или операндом-получателем.

Операнд, указываемый полями MOD и R/M, определяется в соответствии с таблицей, приведенной на Рис. 7.18. Если MOD ≠ 11, эффективный адрес вычисляется согласно таблице. Отметим, что MOD = 00 означает отсутствие смещения, за исключением случая R/M = 110, который обозначает прямую адресацию. Комбинация MOD =01 означает, что третий байт команды содержит 8-битное смещение, которое до вычисления эффективного адреса автоматически расширяется со знаком до 16 бит. Если MOD = 10, третий и четвертый байты команды содержат 16-битное смещение. Наконец, в случае MOD = 11 операндом является регистр, адрес которого определяется полем R/M.

 

Рис. 7.18. Режимы адресации и сегментные регистры по умолчанию для различных комбинаций полей MOD и R/M

Рис. 7.19. Форматы команды сложения ADD в следующих операциях: а — прибавить регистр к регистру или памяти и запомнить результат в регистре или памяти; б — прибавить непосредственный операнд к регистру (памяти) и поместить результат в регистр (память) ; в — прибавить непосредственный операнд к АХ (AL) и запомнить результат в АХ (AL) — специальный случай для аккумулятора

На Рис. 7.18 также показаны сегментные регистры, используемые в каждой из комбинаций полей MOD и R/M. Эффективный адрес операнда в памяти определяется полями MOD и R/M, но 20-битный физический адрес равен сумме эффективного адреса и содержимого сегментного регистра, умноженного на 16. В режимах адресации с привлечением регистра ВР с эффективным адресом суммируется содержимое сегментного регистра SS, а в остальных режимах адресации участвует регистр DS.

Чтобы изменить используемые в соответствии с Рис. 7.18 сегментные регистры, предусмотрена специальная однобайтная команда, называемая префиксом замены сегмента. Она имеет следующий формат:

Если команде предшествует префикс замены сегмента, при обращении к данным в процессе ее выполнения участвует сегментный регистр REG. Для приведенных на Рис. 7.18 режимов адресации регистр DS можно заменить на CS, SS или ES, а регистр SS при участии в адресации регистра ВР — на DS, CS или ES. Замену нельзя производить в следующих специальных случаях:

при вычислении адреса следующей выполняемой команды в качестве сегментного регистра всегда применяется CS;

при участии в адресации регистра SP сегментным регистром всегда служит SS (о стековых операциях см. гл. 4);

в цепочечных командах в качестве сегментного регистра Операнда-получателя всегда используется ES (подробнее см. гл. 5).

Чтобы глубже разобраться в машинных командах микропроцессора 8086, рассмотрим команду сложения ADD. В команде ADD содержимое операнда-источника прибавляется к содержимому операнда-получателя и сумма заменяет содержимое операнда-получателя. В зависимости от режима адресации команда ADD принимает одну из трех форм, представленных на Рис. 7.19.

На Рис. 7.20 показан машинный код двух команд ADD, каждая из которых выполняет следующую операцию:

(CL)«-(BH) + (CL).

В первой команде бит D = 1 указывает, что сумма помещается в регистр REG = 001 = CL. Комбинация MOD =11, поэтому R/M обозначает регистр 111= ВН. Во второй команде бит D = 0, поэтому регистр REG =111 = ВН служит источником. По-прежнему MOD = 11 и R/M обозначает регистр, которым здесь является 001 = CL.

На Рис. 7.21, а показана команда, в которой для сложения содержимого ячейки памяти и регистра применяется относительный базовый индексный

Рис. 7.20. Две эквивалентные команды прибавления содержимого регистра ВН к содержимому CL: когда REG определяет получатель (а) и когда REG определяет источник (б)

Рис. 7.21. Два примера команды ADD с относительным базовым режимом адресации: а — сложение регистра с памятью, б — сложение непосредственного операнда с памятью

режим адресации. Состояние D = 0 показывает, что сумма помещается в ячейку памяти, а бит W = 1 означает 16-битное сложение. Эффективный адрес равен сумме (ВХ), (DI) и 16-битного смещения, которое равно 2345. Если (ВХ) = 0892 и (DI) = 59A3, то

ЕА = 0892 + 59АЗ + 2345 = 857А.

На Рис. 7.21,б показана похожая команда, которая прибавляет к содержимому ячейки памяти непосредственный операнд.

Некоторые команды имеют длинную и короткую формы. Эти формы команды, которая прибавляет непосредственный операнд к регистру АХ, показаны на Рис. 7.22. Так как S:W = 01, команда содержит два байта данных. В длинной форме регистр АХ явно указан полем R/M, а в короткой форме АХ неявно определяется кодом операции.

Рис. 7.22. Длинная (а) и короткая (б) формы прибавления непосредственного операнда к регистру АХ

Рис. 7.23. Последовательность команд в памяти

На Рис. 7.23 показано размещение команд из Рис. 7.20, а, 2.18 и 2.19,6 в памяти, начиная с адреса 00200. Если содержимое CS равно 0018, при выполнении этих команд будет произведен инкремент IP от 0080 до 008Е.

 

 

HotLog

.  

Заказчику web дизайна и программирования - каталог сайтов, обзор дизайн студий