FE23 LOOCH DISASMСПРАВОЧНИК ПО КОМАНДАМ
|
Главная | Загрузка | Инструкция | Команды x86 | Карта сайта |
СТРУКТУРА МАШИННОЙ КОМАНДЫСмотрите также страницы справочника: Структура машинной командыСтруктура машинной команды для режима "32 бита"
Каждая машинная команда может содержать от одного байта до 16 байт.
Примечание. Есть две машинных команды (CALL, код 9A, JMP, код EA), в которых поле для задания адреса занимает 6 байт. Структура машинной команды для режима "16 бит"
Примечание. Есть две машинных команды (CALL, код 9A, JMP, код EA), в которых поле для задания адреса занимает 4 байта. Префиксы перед кодом операцииСобственно команда начинается с кода операции. Но перед командой может быть префикс. И даже сразу несколько префиксов. Каждый префикс - это один байт. Вообще-то префиксы перед командами встречаются не часто. Чтобы в этом убедиться, достаточно посмотреть на какую-нибудь распечатку программы в виде машинных команд, например, на результаты работы дизассемблера. Еще более редко можно увидеть сразу два префикса подряд. Когда перед кодом операции помещаются префиксы, должны соблюдаться следующие два правила: Если в команде есть более одного префикса, то префиксы должны располагаться в том порядке, в котором они показаны в таблицах, приведенных выше. В одной команде не могут стоять сразу два префикса одной группы (сразу два префикса команды или сразу два префикса замены сегмента). Замечено, что процессоры обычно бывают терпимы к нарушению этих правил. Однако, стоит все же считать, что результат таких нарушений может оказаться непредсказуемым. Префикс действует только в пределах той команды, перед которой он стоит.
Код префикса не может совпадать с кодом операции какой-нибудь команды.
Это хорошо видно по таблице
Префиксы команды"Префиксы команды" - это название для первой группы префиксов. Сразу скажем, что не самое удачное название, так как другие префиксы с другими названиями тоже являются префиксами для команды. Префиксы команды имеют свои собственные имена на языке ассемблера. И вдобавок, некоторые ассемблеры показывают эти команды в отдельной строке. Поэтому при программировании на ассемблере эти префиксы команды могут восприниматься как самостоятельные команды. (Это еще раз показывает, что мышление на языке ассемблера может сильно отличаться от мышления на языке машинных команд). Код F0 - префикс блокировки шины, команда LOCK ("lock" - запирать). Этот префикс употребляется только с теми командами, которые поддерживают такую возможность - возможность блокировки шины.
Коды F2, F3 - префиксы повторения, команда REP
("repeat" - повторять) и другие команды этой группы. Такие префиксы
употребляются только с цепочечными командами. Префиксы группы REP
позволяют организовать циклическое выполнение цепочечной команды.
Смотрите страницу
Код F1 - нет такого префикса и нет такой команды. Тут следует заметить, что это единственный код для первого байта команды, который все еще остается свободным. Поневоле напрашивается мысль о существовании некоторой недокументированной возможности ... Префикс изменения размера адресаКод 67. Если общий режим выполнения программы равен "32 бита", то для команды, перед которой есть префикс 67, устанавливается атрибут размера адреса "16" бит. Если общий режим выполнения программы равен "16 бит", то для команды, перед которой есть префикс 67, устанавливается атрибут размера адреса "32" бита. Действие префикса зависит от конкретной команды. Префикс изменения размера операндаКод 66. Если общий режим выполнения программы равен "32 бита", то для команды, перед которой есть префикс 66, устанавливается атрибут размера операнда "16" бит. Если общий режим выполнения программы равен "16 бит", то для команды, перед которой есть префикс 66, устанавливается атрибут размера операнда "32" бита. Действие префикса зависит от конкретной команды. Префиксы замены сегментаДля команд, в которых тем или иным способом задается адрес памяти, этот адрес памяти всегда относится к некоторому сегменту, заданному по умолчанию. С помощью префикса замены сегмента можно изменить сегмент, заданный по умолчанию. Однако, такая замена возможна не во всех случаях - это зависит от конкретной команды.
Код 26 - сегмент по умолчанию заменяется на сегмент ES.
См. также страницу
Код операцииПосле всех префиксов (если перед командой есть префиксы) начинается собственно машинная команда. И начинается машинная команда с кода операции. Поле с кодом операции всегда присутствует в любой машинной команде. Очевидно, что в команде должен быть хотя бы один байт. И тогда этим единственным байтом как раз будет именно код операции. Код операции (сокращенно - КОП) может состоять из одного байта или из двух байт. Если первый байт кода операции имет значение 0F, то в этом коде операции есть еще и второй байт. При обсуждении системы команд удобно использовать понятие "основной байт" кода операции. Если КОП состоит из одного байта, то этот байт и является основным байтом. Если КОП состоит из двух байт, то основным следует считать второй байт кода операции. В данном справочнике имеются таблицы команд, в которых команды расположены в порядке их кодов операции: В таблицах справочника в колонке "Формат" основной байт кода операции условно показан в виде восьми черточек, соотвествующих восьми разрядам основного байта.
Это выглядит так:
Подобное обозначение основного байта есть для каждой команды, так как у каждой команды есть код операции. Для многих команд в основном байте есть особые биты или битовые поля. Такие места в байте показаны буквами на фоне черточек.
Например, обозначение
Разберем какой-нибудь конкретный случай. Пусть это будет команда ADD с кодами 04 и 05, которая выполняет операцию сложения. Двоичная запись для этих кодов операции выглядит так: 00000100 и 00000101, отличие только в самом младшем разряде.
Здесь вариант команды ADD с кодом 04
Но столь просто все было для 16-битных процессоров. С появлением
32-битных ситуация усложнилась. Теперь эта же команда может
выполнить свою операцию для байта (8 бит), слова (16 бит),
двойного слова (32 бита). Вариант команды с
Обозначение
И это значит, что для данной команды имеется восемь разных вариантов с разными кодами операций. Примерами таких команд могут служить однобайтные команды INC и DEC (инкремент и декремент). Можно посмотреть и с другой стороны, со стороны команд ассемблера. Если для команды INC задается в качестве операнда какой-нибудь регистр, например EAX или EBX, то операнд будет указан прямо в коде операции машинной команды.
Полный список обозначений для особых битов и битовых
полей основного байта приведен на странице
И еще одно замечание про код операции. Код операции - один или два байта в начале команды - можно называть основным кодом операции. Так как бывает еще и дополнительный код операции. Дело в том, что в системе команд x86 имеются довольно много таких случаев, когда основной код операции еще не задает полностью, какая именно операция должна выполняться. В этих особых случаях к основному коду операции присоединяются еще три дополнительных бита. Подробнее об этом рассказано ниже, в разделе "Обозначение NNN". Байт MRM - (mod,reg,r/m)
Байт MRM, полное название
Полное название выглядит именно так - "байт Байт MRM имеется не во всех командах. Это определяется конкретным кодом операции (а говоря точнее, "основным кодом операции"), входит ли байт MRM в состав данной машинной команды или не входит.
Здесь важно заметить, что речь идет не о команде с точки зрения
языка ассемблера, а о машинной команде с конкретным основным
кодом операции. Например, команда сложения ADD имеет четыре
разных варианта с байтом MRM, еще четыре варианта
с "сокращенным" байтом MRM, который в нашем справочнике
обозначен как NNN, и два варианта вообще без байта MRM.
Итого это получается десять разных кодов операции, десять разных
вариантов машинной команды.
См. страницу
В таблицах справочника, в колонке "Формат" показано, в составе
каких команд есть байт MRM. Причем наличие в колонке "Формат"
обозначения MRM или обозначения NNN говорит о том, что в составе
команды есть целая группа байтов, относящаяся к MRM. Первым
в этой группе идет байт
Байт MRM делится на три битовых поля:
двухбитовое поле
Поле
Поле
Поле В режиме "32 бита" после байта MRM может стоять еще и второй байт режима адресации - байт SIB, так что количество разных форм задания адреса памяти еще более возрастает. Обозначение NNN
В системе команд x86 имеются такие команды, в которых байт MRM
используется несколько иначе, чем было описано выше. Отличие
в том, как трактуется поле
Дело в том, что основной код операции (один байт или два байта)
не всегда однозначно определяет, какая это команда.
При некоторых значениях основного кода операции к этому коду операции
добавляются еще три бита из поля
Как пример такого случая, можно назвать команды с первым байтом
кода операции равным 80, 81, 82, 83.
См. страницу
В таблицах данного справочника для подобных команд ставится обозначение NNN в колонке "Формат" вместо обозначения MRM. Просто нужно было как-то выделить отдельно этот особый случай. Вот и получился "байт NNN" вместо "байта MRM".
Обозначение NNN показывает, что в команде стоит сокращенный
вариант байта MRM, который может задавать только один операнд,
вместо прежних двух операндов. Этот операнд определяется полями
В системе команд x86 есть случаи, когда байт MRM применяется
в сокращенном виде только из-за того, что для данной
конкретной команды не требуется, чтобы байт MRM задавал два операнда,
так как в этой команде нужен только один операнд. В этом случае поле
Таких случаев совсем немного:
Для этих случаев в таблицах справочника тоже ставится обозначение NNN. Байт SIB - (scale,index,base)Байт SIB - это второй байт режима адресации. Байт SIB возможен в команде только в режиме 32 бита и только в том случае, когда в команде уже есть байт MRM (в полной форме или в сокращенной форме NNN).
Этот дополнительный байт для задания режима адресации включается
в состав команды только при некоторых определенных значениях
в полях Аналогично байту MRM, байт SIB делится на три битовых поля:
Байт SIB позволяет применять еще более сложные формы задания адреса в памяти. Поле для задания адресаВ этом поле из 1, или 2, или 4 байт, расположенном внутри команды, может быть задан либо полный адрес, либо смещение относительно некоторого адреса. С точки зрения терминологии, не всегда можно отличить "смещение" от "полного адреса". Например, как называть полный адрес внутри сегмента, если такой адрес всегда задается смещением от начала сегмента. Поле задания адреса может по-разному использоваться в разных командах. Однако, рассматривая общую структуру команды, важно различать следующие два случая:
Эти два разных случая по-разному отражаются в таблицах справочника в колонке "Формат". Если в формате команды есть обозначение MRM (или обозначение NNN), то дополнительные байты, относящиеся к байту MRM никак не показываются. Так что поле для задания адреса в этом случае показано не будет.
Если в формате команды нет байта MRM, но есть поле для задания
адреса, то в колонке "Формат" будет стоять обозначение
В системе команд x86 невозможен случай, чтобы в некоторой команде
оказалось сразу два поля для задания адреса. Поэтому в таблицах
справочника невозможен случай, чтобы в колонке "Формат" стояло
обозначение MRM (или NNN), а затем еще и обозначение
Поле для задания адреса есть не во всех машинных командах. Непосредственный операндФорматы многих команд предусматривают возможность задавать константу непосредственно внутри команды. На языке ассемблера это соответствует заданию для операнда конкретного численного значения вместо имени переменной.
В таблицах справочника в колонке "Формат" наличие непосредственного
операнда показано обозначением Поле для непосредственного операнда есть не во всех машинных командах. Если в формате команды есть поле для задания непосредственного операнда, то это поле в команде всегда будет последним. Все страницы справочникаСамые последние новые страницы, добавленные в справочник, могут отсутствовать в этом списке. Но все новые страницы заведомо есть в списке на главной странице. Главная страницаОсновные большие таблицыСтруктура машинной командыКоманды по группамРазные заметки |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Главная | Загрузка | Инструкция | Команды x86 | Карта сайта |