20.4. Форматы команд
Архитектура IA-32/64 имеет богатый набор форматов команд. На рис. 20.7 показан обобщенный формат команд.
Рис. 20.7. Формат команд архитектуры IA-32-64: а — префикс; б — команда
Команда может иметь:
до четырех необязательных префиксных компонентов;
одно- или двухбайтовый код операции;
необязательное поле адреса, которое включает байт режима адресации (MOD/RM) и байт коэффициента индексирования (SIB — scale index byte);
необязательное поле смещения;
необязательное поле непосредственного операнда.
Рассмотрим сначала префиксные компоненты, которые имеют длину 1 байт.
Префикс команды. Он состоит из префикса LOCK или одного из префиксов повторения.
Префикс LOCK используется в том случае, когда нужно обеспечить исключительный режим доступа к разделяемой (совместно используемой) оперативной памяти в мультипроцессорной среде.
Префиксы повторения задают повторяющиеся операции над строками, что позволяет процессору обрабатывать строковые данные значительно быстрее, чем при использовании программного цикла.
Существует пять кодов префиксов повторения: REP, ВЕРЕ, REPZ, REPNE и REPNZ. Если в байте префикса стоит код REP, то операция, заданная последующей командой, выполняется по очереди со всеми элементами строки, причем количество повторений задается регистром СХ. Остальные варианты префикса повторения задают такой режим выполнения следующей за этим префиксом команды, что она повторяется до тех пор, пока код в счетчике СХ не уменьшится до нуля или пока не будет выполнено определенное условие.
Переназначение сегмента. Префикс в явном виде задает регистр сегмента, который должен быть использован при выполнении следующей команды, и отменяет использование регистра сегмента, назначенного по умолчанию.
Размер адреса. Префикс этого типа указывает размер смещения в коде команды и размер смещения, формируемого при вычислении исполнительного адреса. Один из размеров используется в качестве параметра, заданного по умолчанию, а значение, указанное в префиксе, временно отменяет его действие.
Размер операнда. Под поле операнда в коде команды может отводиться 16 или 32 разряда. Одно из этих значений используется в качестве параметра, заданного по умолчанию. Значение, указанное в префиксе, временно отменяет его действие.
Формат команды включает следующие поля.
Код операции. Это поле может занимать один или два байта. В состав кода операции могут быть включены разряды, указывающие размер операндов (байт, 2 байта, 4 байта в зависимости от контекста), а также направление пересылки данных (из оперативной памяти или в оперативную память) и сообщают, должно ли выполняться расширение знака непосредственно заданного операнда.
Байт MOD/RM. Этот и следующий байты содержат информацию, касающуюся адресации. Байт MOD/RM указывает, где находится операнд — в оперативной памяти или в регистре. Если операнд находится в оперативной памяти, поля в этом байте указывают режим адресации. Байт MOD/RM состоит из трех полей. Код в поле MOD (2 разряда) вместе с кодом в поле R/M дают 32 комбинации, 8 из которых определяют регистры, а 24 — варианты индексного режима. Код в поле Reg/Opcode (3 разряда) либо задает номер регистра, либо присоединяется к коду операции. Код в поле R/M (3 разряда) может определять регистр в качестве места размещения операнда или присоединяется к коду в поле MOD.
Байт SIB. Некоторые комбинации в байте MOD/RM указывают на использование байта SIB при задании режима адресации. Байт SXB состоит из трех полей. Поле SS (2 разряда) определяют коэффициент индексирования, в поле Index (3 разряда) задается индексный регистр, а в поле Ваsе (3 разряда) — регистр базы.
Смещение. Если из параметров адресации следует, что при определении исполнительного адреса нужно учитывать смещение, в этом поле размещается его 8-, 16- или 32-разрядное значение.
Непосредственный операнд. В непосредственном режиме адресации содержится значение операнда.
Ко всему сказанному следует сделать несколько замечаний. В формате команд архитектуры IA-32-64 режим адресации является скорее следствием определенного кода операции, чем частью независимой спецификации каждого операнда. Поскольку для каждой операции информация о режиме адресации касается только одного операнда, только один из операндов, указывающийся в машинной команде, может находиться в оперативной памяти.
Формат команд архитектуры IA-32/64 позволяет использовать не только однобайтовое смещение при индексации, но и 2-, и даже 4-байтовое. Хотя применение больших значений смещения увеличивает длину команды, это свойство повышает гибкость программы, что оказывается полезным при работе с большими массивами или большими кадрами стека.
Как видно из представленного материала, форматы набора команд архитектуры IA-32/64 чрезвычайно запутаны. Частично это объясняется желанием сохранить обратную совместимость с командами прежних моделей процессоров с архитектурой IA-32/64, а частично — желанием разработчиков архитектуры предоставить системным программистам как можно более широкие возможности для разработки эффективных машинных программ. В настоящее время нет единого мнения по вопросу, действительно ли такой подход — предоставление программисту чрезвычайно разнообразного набора команд — позволяет создавать более эффективные программы, чем альтернативный подход, предлагаемый сторонниками RISC-архитектуры.
