Машинная команда представляет собой закодированное по определенным правилам указание микропроцессору на выполнение некоторой операции или действия. Каждая команда содержит элементы, определяющие:
1) что делать?
2) объекты, над которыми нужно что-то делать (эти элементы называются операндами);
3) как делать?
Максимальная длина машинной команды – 15 байт.
1. Префиксы.
Необязательные элементы машинной команды, каждый из которых состоит из 1 байта или может отсутствовать. В памяти префиксы предшествуют команде. Назначение префиксов – модифицировать операцию, выполняемую командой. Прикладная программа может использовать следующие типы префиксов:
1) префикс замены сегмента;
2) префикс разрядности адреса уточняет разрядность адреса (32– или 16-разрядный);
3) префикс разрядности операнда аналогичен префиксу разрядности адреса, но указывает на разрядность операндов (32– или 16-разрядные), с которыми работает команда;
4) префикс повторения используется с цепочечными командами.
2. Код операции.
Обязательный элемент, описывающий операцию, выполняемую командой.
3. Байт режима адресации modr/m.
Значения этого байта определяет используемую форму адреса операндов. Операнды могут находиться в памяти в одном или двух регистрах. Если операнд находится в памяти, то байт modr/m определяет компоненты (смещение, базовый и индексный регистры),
используемые для вычисления его эффективного адреса. Байт modr/m состоит из трех полей:
1) поле mod определяет количество байт, занимаемых в команде адресом операнда;
2) поле reg/коп определяет либо регистр, находящийся в команде на месте первого операнда, либо возможное расширение кода операции;
3) поле r/m используется совместно с полем mod и определяет либо регистр, находящийся в команде на месте первого операнда (если mod = 11), либо используемые для вычисления эффективного адреса (совместно с полем смещение в команде) базовые и индексные регистры.
4. Байт масштаб – индекс – база (байт sib). Используется для расширения возможностей адресации операндов. Байт sib состоит из трех полей:
1) поля масштаба ss. В этом поле размещается масштабный множитель для индексного компонента index, занимающего следующие 3 бита байта sib;
2) поля index. Используется для хранения номера индексного регистра, который применяется для вычисления эффективного адреса операнда;
3) поля base. Используется для хранения номера базового регистра, который также применяется для вычисления эффективного адреса операнда.
5. Поле смещения в команде.
8-, 16– или 32-разрядное целое число со знаком, представляющее собой, полностью или частично (с учетом вышеприведенных рассуждений), значение эффективного адреса операнда.
6. Поле непосредственного операнда. Необязательное поле, представляющее собой 8-,
16– или 32-разрядный непосредственный операнд. Наличие этого поля, конечно, отражается на значении байта modr/m.