Машинная команда представляет собой закодированное по определенным правилам указание микропроцессору на выполнение некоторой операции или действия. Каждая команда содержит элементы, определяющие:
что делать? (ответ на этот вопрос дает элемент команды, называемый кодом операции (КОП));
объекты, над которыми нужно что-то делать (эти элементы называются операндами);
как делать? (эти элементы называются типами операндов — обычно задаются неявно).
Приведенный на рис. 1 формат машинной команды является самым общим. Максимальная длина машинной команды — 15 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного — только КОП.
Рис. 1. Формат машинной команды
Опишем назначения полей машинной команды.
Префиксы. Необязательные элементы машинной команды, каждый из которых состоит из одного байта или может отсутствовать. В памяти префиксы предшествуют команде. Назначение префиксов — модифицировать операцию, выполняемую командой. Прикладная программа может использовать следующие типы префиксов:
Префикс замены сегмента. В явной форме указывает, какой сегментный регистр используется в данной команде для адресации стека или данных. Префикс отменяет выбор сегментного регистра по умолчанию. Префиксы замены сегмента имеют следующие значения:
2eh — замена сегмента cs;
36h — замена сегмента ss;
3eh — замена сегмента ds;
26h — замена сегмента es;
64h — замена сегмента fs;
65h — замена сегмента gs.
Префикс разрядности адреса уточняет разрядность адреса (32 или 16-разрядный).
Каждой команде, в которой используется адресный операнд, ставится в соответствие разрядность адреса этого операнда. Этот адрес может иметь разрядность 16 или 32 бит. Если разрядность адреса для данной команды 16 бит, это означает, что команда содержит 16-разрядное смещение (см. ), оно соответствует 16-разрядному смещению адресного операнда относительно начала некоторого сегмента. В контексте это смещение называется эффективный адрес. Если разрядность адреса 32 бит, это означает, что команда содержит 32-разрядное смещение (см. ), оно соответствует 32-разрядному смещению адресного операнда относительно начала сегмента и по его значению формируется 32-битное смещение в сегменте. С помощью префикса разрядности адреса можно изменить действующее по умолчанию значение разрядности адреса. Это изменение будет касаться только той команды, которой предшествует префикс.