Структура машинной команды

      Комментарии к записи Структура машинной команды отключены

Машинная команда представляет собой закодированное по определенным правилам указание микропроцессору на выполнение некоторой операции или действия. Каждая команда содержит элементы, определяющие:

  • что делать? (ответ на этот вопрос дает элемент команды, называемый кодом операции (КОП));
  • объекты, над которыми нужно что-то делать (эти элементы называются операндами);
  • как делать? (эти элементы называются типами операндов — обычно задаются неявно).

Приведенный на рис. 1 формат машинной команды является самым общим. Максимальная длина машинной команды — 15 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного — только КОП.

Назначение полей машинной команды.

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

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

§ 2eh — замена сегмента cs;

§ 36h — замена сегмента ss;

§ 3eh — замена сегмента ds;

§ 26h — замена сегмента es;

§ 64h — замена сегмента fs;

§ 65h — замена сегмента gs.

Рисунок 1 –Формат машинной команды

o Префикс разрядности адреса уточняет разрядность адреса (32 или 16-разрядный).
Каждой команде, в которой используется адресный операнд, ставится в соответствие разрядность адреса этого операнда. Этот адрес может иметь разрядность 16 или 32 бит. Если разрядность адреса для данной команды 16 бит, это означает, что команда содержит 16-разрядное смещение (см. рис. 1), оно соответствует 16-разрядному смещению адресного операнда относительно начала некоторого сегмента. В контексте рис. 2 это смещение называется эффективный адрес. Если разрядность адреса 32 бит, это означает, что команда содержит 32-разрядное смещение (см. рис. 1), оно соответствует 32-разрядному смещению адресного операнда относительно начала сегмента и по его значению формируется 32-битное смещение в сегменте. С помощью префикса разрядности адреса можно изменить действующее по умолчанию значение разрядности адреса. Это изменение будет касаться только той команды, которой предшествует префикс.

o Префикс разрядности операнда аналогичен префиксу разрядности адреса, но указывает на разрядность операндов (32 или 16-разрядные), с которыми работает команда. В соответствии с какими правилами устанавливаются значения атрибутов разрядности адреса и операндов по умолчанию?
В реальном режиме и режиме виртуального i8086 значения этих атрибутов — 16 бит.

В защищенном режиме значения атрибутов зависят от состояния бита D в дескрипторах исполняемых сегментов (см. урок 16). Если D = 0, то значения атрибутов, действующие по умолчанию, равны 16 бит; если D = 1, то 32 бит.
Значения префиксов разрядности операнда 66h и разрядности адреса 67h. Вы можете с помощью префикса разрядности адреса в реальном режиме использовать 32-разрядную адресацию, но при этом необходимо помнить об ограниченности размера сегмента величиной 64 Кбайт. Аналогично префиксу разрядности адреса вы можете использовать префикс разрядности операнда в реальном режиме для работы с 32-разрядными операндами (к примеру, в арифметических командах).

o Префикс повторения используется с цепочечными командами (командами обработки строк). Этот префикс “зацикливает” команду для обработки всех элементов цепочки. Система команд поддерживает два типа префиксов:

§ безусловные (rep — 0f3h), заставляющие повторяться цепочечную команду некоторое количество раз;

§ условные (repe/repz — 0f3h, repne/repnz — 0f2h), которые при зацикливании проверяют некоторые флаги, и в результате проверки возможен досрочный выход из цикла.

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

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

  • Байт режима адресации modr/m. Значения этого байта определяет используемую форму адреса операндов. Операнды могут находиться в памяти в одном или двух регистрах. Если операнд находится в памяти, то байт modr/m определяет компоненты (смещение, базовый и индексный регистры), используемые для вычисления его эффективного адреса (см. лаб.р.3). В защищенном режиме для определения местоположения операнда в памяти может дополнительно использоваться байт sib (Scale-Index-Base — масштаб-индекс-база). Байт modr/m состоит из трех полей (см. рис. 1):

o поле mod определяет количество байт, занимаемое в команде адресом операнда (см. рис. 1, поле смещение в команде). Поле mod используется совместно с полем r/m, которое указывает способ модификации адреса операнда смещение в команде. К примеру, если mod = 00, это означает, что поле смещение в команде отсутствует, и адрес операнда определяется содержимым базового и (или) индексного регистра. Какие именно регистры будут использоваться для вычисления эффективного адреса, определяется значением этого байта. Если mod = 01, это означает, что поле смещение в команде присутствует, занимает один байт и модифицируется содержимым базового и (или) индексного регистра. Если mod = 10, это означает, что поле смещение в команде присутствует, занимает два или четыре байта (в зависимости от действующего по умолчанию или определяемого префиксом размера адреса) и модифицируется содержимым базового и (или) индексного регистра. Если mod = 11, это означает, что операндов в памяти нет: они находятся в регистрах. Это же значение байта mod используется в случае, когда в команде применяется непосредственный операнд;

o поле reg/коп определяет либо регистр, находящийся в команде на месте первого операнда, либо возможное расширение кода операции;

o поле r/m используется совместно с полем mod и определяет либо регистр, находящийся в команде на месте первого операнда (если mod = 11), либо используемые для вычисления эффективного адреса (совместно с полем смещение в команде) базовые и индексные регистры.

  • Байт масштаб-индекс-база (байт sib) используется для расширения возможностей адресации операндов.
    На наличие байта sib в машинной команде указывает сочетание одного из значений 01 или 10 поля mod и значения поля r/m= 100. Байт sib состоит из трех полей:

o поля масштаба ss. В этом поле размещается масштабный множитель для индексного компонента index, занимающего следующие три бита байта sib.
В поле ss может содержаться одно из следующих значений: 1, 2, 4, 8.
При вычислении эффективного адреса на это значение будет умножаться содержимое индексного регистра. Более подробно с практической точки зрения эта расширенная возможность индексации рассматривается на уроке 12 при обсуждении вопросов работы с массивами;

o поля index — используется для хранения номера индексного регистра, который применяется для вычисления эффективного адреса операнда;

o поля base — используется для хранения номера базового регистра, который также применяется для вычисления эффективного адреса операнда. Напомню, что в качестве базового и индексного регистров могут использоваться практически все регистры общего назначения.

  • Поле смещения в команде. 8, 16 или 32-разрядное целое число со знаком, представляющее собой, полностью или частично (с учетом вышеприведенных рассуждений), значение эффективного адреса операнда.
  • Поле непосредственного операнда. Необязательное поле, представляющее собой 8, 16 или 32-разрядный непосредственный операнд. Наличие этого поля, конечно, отражается на значении байта modr/m.

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

Формат двухоперандной команды имеет вид:

Opc d wMod reg r/m

Первый байт команды содержит код операции и два однобитовых поля: направления d и размерность операнда w. При d=1 осуществляется передача операнда или результата операции в регистр, который определяется полем reg второго байта команды; при d=0 – передача из указанного регистра. Поле w идентифицирует разрядность операндов: при w=1 команда оперирует словом, при w=0 – байтом.

Второй байт, называемый постбайтом, определяет участвующими в операции регистры или RG и ячейку памяти. Постбайт состоит из 3-х полей: md – режим, reg – адрес регистра, r/m – адрес второго регистра/вид адресации для используемой ячейки памяти. Поле reg определяет операнд, который обязательно находится в регистре и условно считается вторым операндом. Поле r/m определяет операнд, который может находится в регистре или в памяти, и условно считается первым. Способ кодирования внутренних регистров микропроцессора: если mod=11, то оба операнда содержатся в регистрах и поля reg и r/m определяют используемые регистры, указанные в таблице.

ПоляRegи r/m регистр ПоляRegи r/m регистр
Еслиw=0 Еслиw=1 Еслиw=0 Если w=1
al ax ah sp
cl cx ch bp
dl dx dh si
bl bx bh di

Поле reg используется для указания регистра только в двухоперандных командах. Если в команде один операнд, то он идентифицируется полем r/m, а поле reg используется для расширения кода операции.

Поле mod показывает, как интерпретируется поле r/m для нахождения первого операнда: если mod=11. то операнд содержится в регистре, в остальных случаях в памяти. Когда адресуется память, поле mod определяет используемое смещение disp, находящегося в 3-ем и 4-ом байтах.

Кодирование поля r/m

Поле r/m Получение исполнительного адреса EA Поле r/m Получение исполнительного адреса EA
EA=(BX)+(SI)+disp EA=(SI)+disp
EA=(BX)+(DI)+disp EA=(DI)+disp
EA=(BP)+(SI)+disp EA=(BP)+disp
EA=(BP)+(DI)+disp EA=(BX)+disp

Если mod=00 и r/m=110, то EA=disp, т.е. команда содержит абсолютный адрес памяти. Т.о. операнд в памяти можно адресовать прямо или косвенно. Во втором случае память можно адресовать через базовый регистр (BP или BX), через индексный регистр (SI или DI), а также через комбинацию базового и индексного регистра.

Статьи к прочтению:

Структура продуктивной команды


Похожие статьи:

  • Структура и форматы команд эвм

    Обработка информации в ЭВМ осуществляется путём программного управления. Программа представляет собой алгоритм обработки информации, записанной в виде…

  • Структура и формат команды.

    Под командой понимается совокупность сведений, необходимых микропроцессору для выполнения требуемого действия. Процессору необходимо задать информацию о…