Машинная команда представляет собой закодированное по определенным правилам указание микропроцессору на выполнение некоторой операции или действия. Каждая команда содержит элементы, определяющие:
- что делать? (ответ на этот вопрос дает элемент команды, называемый кодом операции (КОП));
- объекты, над которыми нужно что-то делать (эти элементы называются операндами);
- как делать? (эти элементы называются типами операндов — обычно задаются неявно).
Приведенный на рис. 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), а также через комбинацию базового и индексного регистра.
Статьи к прочтению:
Структура продуктивной команды
Похожие статьи:
-
Структура и форматы команд эвм
Обработка информации в ЭВМ осуществляется путём программного управления. Программа представляет собой алгоритм обработки информации, записанной в виде…
-
Под командой понимается совокупность сведений, необходимых микропроцессору для выполнения требуемого действия. Процессору необходимо задать информацию о…