Что такое машинная команда какая информация содержится в ней
Каждая программа состоит из отдельных машинных команд; команда является указанием процессору произвести какую-либо элементарную операцию, например, копирования информации, сложения
и др. Все программы более высокого уровня (текстовый редактор, лазерный проигрыватель и прочие, в том числе написанные на языках программирования) сводятся к последовательности машинных команд.
Совокупность всех операций, которые может выполнять машина, образует систему ее команд. Система команд зависит от конструкции ЭВМ;
в пределах одного семейства компьютеры имеют совместимые инструкции.
Несмотря на отдельные отличия, системы машинных команд имеют много общего. Любая ЭВМ обязательно содержит следующие группы команд обработки информации.
1. Команды передачи данных (перепись), копирующие информацию из одного места в другое.
2. Арифметические операции, которым фактически обязана своим рождением вычислительная техника. Конечно, доля вычислительных действий в современном компьютере заметно уменьшилась, но они по-прежнему играют в программах важную роль.
3. Логические операции, позволяющие компьютеру производить анализ получаемой информации. После выполнения такой команды, с помощью условного перехода ЭВМ способна выбрать дальнейший ход выполнения программы. Простейшими примерами команд рассматриваемой группы могут служить сравнение, а также известные логические операции И, ИЛИ, НЕ (инверсия). Кроме того, к ним часто добавляется анализ отдельных битов кода, их сброс и установка.
4. Сдвиги двоичного кода. Для доказательства важности этой группы команд достаточно вспомнить правило умножения столбиком: каждое последующее произведение записывается в такой схеме со сдвигом на одну цифру влево.
5. Команды ввода и вывода информации для обмена с внешними устройствами.
6. Команды управления, к которым прежде всего следует отнести условный и безусловный переход, а также команды обращения к подпрограмме (переход с возвратом). Некоторые ЭВМ имеют специальные команды для организации циклов, но это не обязательно: любой цикл может быть сведен к той или иной комбинации условного и безусловного переходов. Часто к этой же группе команд относят операции по управлению процессором; с ростом сложности устройства процессора количество такого рода команд увеличивается.
По степени сложности команд и их ассортименту процессоры разделяют на две группы — RISC и CISC (см. “Процессор”).
Пожалуй, наиболее удивительным является тот факт, что с помощью относительно небольшого многообразия универсальных команд удается создать программное обеспечение, которое способно себя вести весьма сложным образом.
Любая команда ЭВМ обычно состоит из двух частей — операционной и адресной. Операционная часть (иначе она еще называется кодом операции — КОП) указывает, какое действие необходимо выполнить с информацией. Адресная часть описывает, где используемая информация хранится и куда поместить результат.
Команды могут быть одно-, двух- и трехадресные в зависимости от количества возможных операндов. Первые ЭВМ имели наиболее простую и наглядную трехадресную систему команд. Например: взять числа из адресов памяти А1 и А2, сложить их и сумму поместить в адрес А3. Для реализации этого сложения на одноадресной машине потребуется выполнить не одну, а три команды:
a) извлечь содержимое ячейки А1 в сумматор;
b) сложить сумматор с числом из А2;
c) записать результат из сумматора в А3.
Может показаться, что одноадресной машине для решения любой задачи потребуется втрое больше команд, чем трехадресной. На самом деле это далеко не всегда так. Попробуйте самостоятельно спланировать программу вычисления выражения Y = (X1 + X2) * X3/X4 и вы с удивлением обнаружите, что потребуется 3 трехадресных команды и всего 5 одноадресных. Таким образом, одноадресная машина в чем-то даже эффективнее, т.к. она не производит ненужной записи в память промежуточных результатов.
Ради полноты изложения следует сказать о возможности реализации безадресной (нульадресной) машины, использующей особый способ организации памяти — стек. Хотя подобная машина неудобна для человека, она легко реализуется в компьютере; в частности, именно так устроена JAVA-машина.
Чтобы получить хотя бы некоторое представление об уровне машинных команд, приведем примеры нескольких типичных инструкций для процессоров семейства Intel.
С точки зрения программиста, машинные команды — это самый низкий уровень. Но для процессора каждая инструкция распадается на еще более простые составные части, которые принято называть тактами. На каждом такте процессор выполняет какие-либо совсем элементарные действия, например, обнуляет один из своих внутренних регистров, копирует содержимое из одного регистра в другой, анализирует содержимое отдельных битов информации и т.д. Для синхронизации последовательных машинных тактов они инициируются с помощью специального тактового генератора. Его частота выбирается инженерами таким образом, чтобы к началу следующего такта все операции предыдущего успевали надежно заканчиваться.
Различные по сложности операции выполняются за разное количество тактов. Например, передача содержимого одного регистра в другой выполняется гораздо быстрее, чем умножение чисел. Существенно удлиняется выполнение команды, если ее данные берутся не из внутренних регистров самого процессора, а из оперативной памяти (именно поэтому в процессор встраивается внутренний кэш).
Из сказанного выше отчетливо следует, что тактовая частота, определяющая время выполнения составляющих машинной команды, является важной характеристикой процессора: чем она выше, тем быстрее при прочих равных условиях работает процессор. Подчеркнем, что в случае различных алгоритмов выполнения операций внутри разных моделей процессоров использовать тактовую частоту как меру сравнения их быстродействия весьма проблематично.
Эксперименты показывают 5, что для процессоров типа Pentium и ниже простые инструкции (пересылки, сложение регистров и т.п.) выполняются примерно за один такт. Таким образом, тактовая частота вполне может служить приблизительной оценкой количества таких операций, выполняемых за 1 секунду. Для более поздних моделей картина существенно “размывается” из-за сложных методов одновременного выполнения нескольких операций.
Методические рекомендации
Курс информатики основной школы
В базовом курсе достаточно дать ученикам лишь наиболее общее представление о машинных командах. При этом важно подчеркнуть два аспекта проблемы. Во-первых, как и любой исполнитель, компьютер имеет собственную систему команд. А во-вторых, эта система является базовой для реализации всех остальных уровней программного обеспечения.
Предложенное в статье объяснение понятия тактовой частоты не является традиционным, но оно достаточно просто для понимания и хорошо согласуется с устройством процессоров.
Курс информатики в старших классах
При изучении программного обеспечения можно рекомендовать учителю в ознакомительном плане изложить материал данной статьи. Хотя полученные знания, вероятно, не будут непосредственно применяться учениками, для формирования общих представлений об обработке информации на компьютере они являются весьма полезными.
Принципы исполнения программы в машинных командах можно также изучать с помощью известного по методической литературе приема — учебной модели ЭВМ, такой, как “Кроха”, “Нейман”, “Малютка”, и др. 6. Достоинство такого подхода заключается в том, что учебная модель компьютера, отражая его наиболее важные черты, в то же время устроена наиболее просто и не содержит “отвлекающих” внимание учеников второстепенных деталей. На базе учебного компьютера можно продемонстрировать ученикам следующие вопросы: программный принцип работы ЭВМ, система команд, хранение данных в ОЗУ — и некоторые другие. При наличии соответствующего учебного ПО (его можно взять, например, с указанного выше сайта) можно даже продемонстрировать ученикам на базе изучаемой модели, что такое языки ассемблер и Паскаль.
5 См., например, эксперименты 3.6.2 в: Еремин Е.А. Популярные лекции об устройстве компьютера. СПб.: BHV-Петербург, 2003, 272 с.
6 Подробному описанию учебных моделей посвящен сайт https://educomp.runnet.ru/.
Источник
Язык машинных команд
Теперь познакомимся еще с одним принципом архитектуры ЭВМ, предложенным фон
Нейманом. Он называется принципом хранимой программы.
Наряду с данными в оперативную память компьютера помещается программа управления
его работой.
Компьютер является исполнителем программ и, следовательно, обладает своей
системой команд (СКИ).
Команды управления работой компьютера принято называть машинными командами.
- Машинная команда должна содержать в себе следующую информацию:
- какую операцию выполнить;
- где находятся операнды;
- куда поместить результат операции;
- какую команду выполнять следующей.
Компьютеры разных типов имеют разную структуру команд.
Всякая машинная команда состоит из кода операции и адресной части.
В «УК Нейман» машинные команды имеют трехадресную структуру (формат). Это
значит, что ячейка, в кото-рой хранится команда, делится на четыре части (по
одному байту на каждую часть). Будем их обозначать следующим образом:
КОП — код операции,
А1 — адрес первого операнда,
А2 — адрес второго операнда,
A3 — адрес результата.
Операндами называют данные, над которыми производится операция. В
арифметических операциях это слагаемые, сомножители, уменьшаемое и вычитаемое,
делимое и делитель.
Вот пример команды сложения двух чисел (в шестнадцатеричной форме):
01 — это код операции сложения;
44 — адрес первого слагаемого;
48 — адрес второго слагаемого;
4С — адрес ячейки, в которую помещается сумма.
Для всех арифметических операций ответ на вопрос: «Какую команду выполнять
следующей?» всегда одинаковый: следующей выполняется команда, находящаяся в
следующей ячейке памяти.
Записывать команды на бумаге удобнее в шестнадцатеричной форме. В памяти ЭВМ
команда имеет двоичный вид. Используя двоично-шестнадцатеричную таблицу, легко
получить внутреннее представление приведенной выше команды:
КОП | А1 | А2 | A3 |
00000001 | 01000100 | 01001000 | 01001100 |
В ТАБЛИЦЕ 2 содержится система команд «УК Нейман».
ТАБЛИЦА 2. Система команд «УК Нейман»:
КОП | Операция | Пояснение |
00 | Пересылка | (А1)=>АЗ |
01 | Сложение | (А1) + (А2)=>АЗ |
02 | Вычитание | (А1)-(А2)=>АЗ |
03 | Умножение | (А1)*А2)=>АЗ |
77 | Останов | Прекращение выполнения программы программы |
Запись (А1) + (А2) => A3 надо понимать так: содержимое ячейки с адресом А1
сложить с содержимым ячейки с адресом А2 и результат записать в ячейку A3;
(А1)=> A3 — содержимое ячейки А1 занести (скопировать) в ячейку A3.
Совокупность правил записи программ управления компьютером с использованием
машинных команд называется машинным языком (или языком машинных команд).
Рассмотрим пример небольшой программы на машинном языке. Пусть, например,
требуется вычислить выражение
(А + В)*С.
Каждое число, участвующее в расчетах, занимает ячейку памяти. Программист должен
сам распределять память под данные. Под величины А, В, С выделим следующие
ячейки памяти:
(20) = А,    (24) = В,   (28) = С.
Результат вычисления выражения поместим в ячейку 2С. Команды программы тоже
помещаются в определенные ячейки. Вот фрагмент программы, решающей нашу задачу:
Адрес | КОП | А1 | А2 | A3 | Пояснение |
ОС | 01 | 20 | 24 | 2С | (20)+(24) => 2С     А+В |
10 | 03 | 2С | 28 | 2С | (2С)х(28)=>2С    (А+В)*С |
В графе «Адрес» указываются номера ячеек, в которых располагаются команды.
Команды этой программы выполняются в «естественном порядке» возрастания адресов
ячеек: сначала ОС, затем 10 (еще раз напомним, что адреса ячеек меняются с шагом
4).
Занесение значения в ячейку памяти называется присваиванием.
В результате присваивания старое значение, которое хранилось в этой ячейке,
стирается и заменяется на новое.
Если ячейке ничего не присвоено, то ее значение является неопределенным.
Ячейке 2С значение присваивается дважды: сначала результат суммирования, затем —
умножения. Первый результат — промежуточный, второй — окончательный.
Однако приведенная программа не может быть исполнена. Во-первых, не определены
значения исходных данных А, В, С. Во-вторых, пользователь не сможет узнать
результаты вычислений, поскольку они останутся внутри памяти, в ячейке 2С, а в
нее не заглянешь.
Исходные данные должны задаваться вводом.
Ввод — это процесс занесения данных в оперативную память с помощью устройств
ввода.
Результаты вычислений должны быть выведены.
Вывод — это отражение информации в оперативной памяти на устройствах вывода.
Вывод делает результаты выполнения программы доступными для пользователя.
Устройством ввода на «УК Нейман» является клавиатура. Устройством вывода —
экран.
В «УК Нейман» ввод и вывод организованы следующим образом: с клавиатурой и
экраном связана последняя ячейка памяти — ячейка FC. Будем называть ее буферной
ячейкой ввода-вывода.
При вводе набираемое на клавиатуре значение попадает в ячейку FC. На экране
постоянно отражается содержимое ячейки FC в шестнадцатеричном виде. Поэтому для
вывода значения из любой ячейки памяти его надо переслать в буферную ячейку FC.
Из ТАБЛИЦЫ 2 следует, что команда пересылки имеет вид:
В этой команде содержимое адреса А2 не влияет на ее исполнение (в дальнейшем на
месте А2 будем писать нули). В результате выполнения команды пересылки значение
в ячейке A3 становится равным (А1). При этом значение ячейки А1 не меняется.
Иначе это называется так: ячейке A3 присваивается значение ячейки А1.
Поясним на примере.
Пусть в 10-й ячейке находится число 5, а в 20-й ячейке число 7:
10
  20
После выполнения команды
00 10 00 20
их значения станут одинаковыми:
10
  20
В рассмотренной выше задаче вычисления (А + В) * Сна экран нужно вывести
результат, полученный в ячейке 2С. Для этого его следует присвоить ячейке FC.
Значит, команда вывода будет такой:
00 2С 00 FC.
Как запрограммировать ввод значения А в ячейку 20? Делается это так:
00 FC 00 20.
Процессор, обнаружив команду, у которой КОП=00 и A1=FC, прерывает работу и ждет
действий пользователя. Пользователь набирает на клавиатуре вводимое число. Это
число заносится в ячейку FC и одновременно высвечивается на экране. Затем
пользователь нажимает клавишу . Процессор выполняет команду пересылки из
ячейки FC в ячейку 20. Ввод завершился, процессор переходит к выполнению
следующей команды.
Запишем команды ввода и вывода в общем виде:
00 FC 00 A3 — ввод числа в ячейку
A3 00 А1 00 FC — вывод числа из ячейки А1
А теперь запишем программу вычисления выражения (А+В) * С в окончательном виде.
Договоримся, что любая программа будет располагаться в начале памяти. Первая
команда всегда находится в ячейке 00.
ПРОГРАММА 1:
Адрес | КОП | А1 | А2 | A3 | Пояснения |
00 | 00 | FC | 00 | 20 | ввод А |
04 | 00 | FC | 00 | 24 в | ввод В |
08 | 00 | FC | 00 | 28 | ввод С |
ОС | 01 | 20 | 24 | 2С | А+В |
10 | 03 | 2С | 28 | 2С | (А+В)*С |
14 | 00 | 2С | 00 | FC | вывод результата |
18 | 77 | 00 | 00 | 00 | стоп |
В ячейке 18 находится команда останова с кодом операции 77. Результат ее
выполнения — остановка работы машины. Содержимое адресной части в этой команде
не имеет значения.
Коротко о главном
Программа, управляющая работой компьютера, помещается в его оперативную память.
В машинной команде заключена следующая информация: какая выполняется операция,
где хранятся операнды, куда поместить результат, какую команду выполнять
следующей (если нет указания, то следующей выполняется команда, расположенная в
следующей ячейке).
Машинная команда состоит из кода операции (КОП) и адресной части.
«УК Нейман»имеет трехадресную структуру команды: КОП A1 A2 A3.
Для арифметических операций А1 и А2 — адреса операндов, A3 — адрес результата.
Исходные данные вводятся в память по команде ввода, результаты выводятся по
команде вывода.
Вопросы и задания
- В чем состоит принцип хранимой программы?
- Что такое машинный язык?
- Что такое машинная команда? Какая информация содержится в ней?
- Из каких частей состоит машинная команда?
- Почему структура команд «УК Нейман» называется трехадресной? Каково
назначение каждого адреса в арифметической команде? - Что называется присваиванием? Что происходит с содержимым ячейки при
присваивании ей нового значения? - Что такое ввод и вывод? По какой команде в «УК Нейман» происходит ввод и по
какой команде — вывод? - Какое действие определяет следующая команда на машинном языке «УК Нейман»:
02 20 24 28?
Источник
Источник: Структура машинной команды
Смотрите также страницы справочника:
Байты MRM и SIB – формы адресации
Все коды байта MRM (16 бит)
Все коды байта MRM (32 бит)
Все коды байта SIB
Пояснения к основным таблицам
Команды ассемблера и машинные команды
Структура машинной команды
Структура машинной команды для режима “32 бита”
Каждая машинная команда может содержать от одного байта до 16 байт.
Число байт | Компонент команды |
0 или 1 | Префикс команды |
0 или 1 | Префикс изменения размера адреса |
0 или 1 | Префикс изменения размера операнда |
0 или 1 | Префикс замены сегмента |
1 или 2 | Код операции |
0 или 1 | Байт MRM – (mod,reg,r/m) |
0 или 1 | Байт SIB – (scale,index,base) |
0,1,2 или 4 | Поле для задания адреса |
0,1,2 или 4 | Непосредственный операнд |
Примечание. Есть две машинных команды (CALL, код 9A, JMP, код EA), в которых поле для задания адреса занимает 6 байт.
Структура машинной команды для режима “16 бит”
Число байт | Компонент команды |
0 или 1 | Префикс команды |
0 или 1 | Префикс замены сегмента |
1 или 2 | Код операции |
0 или 1 | Байт MRM – (mod,reg,r/m) |
0,1 или 2 | Поле для задания адреса |
0,1 или 2 | Непосредственный операнд |
Примечание. Есть две машинных команды (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.
Код 2E – сегмент по умолчанию заменяется на сегмент CS.
Код 36 – сегмент по умолчанию заменяется на сегмент SS.
Код 3E – сегмент по умолчанию заменяется на сегмент DS.
Код 64 – сегмент по умолчанию заменяется на сегмент FS.
Код 65 – сегмент по умолчанию заменяется на сегмент GS.
См. также страницу Коды сегментных регистров.
Код операции
После всех префиксов (если перед командой есть префиксы) начинается собственно машинная команда. И начинается машинная команда с кода операции.
Поле с кодом операции всегда присутствует в любой машинной команде. Очевидно, что в команде должен быть хотя бы один байт. И тогда этим единственным байтом как раз будет именно код операции.
Код операции (сокращенно – КОП) может состоять из одного байта или из двух байт. Если первый байт кода операции имет значение 0F, то в этом коде операции есть еще и второй байт.
При обсуждении системы команд удобно использовать понятие “основной байт” кода операции. Если КОП состоит из одного байта, то этот байт и является основным байтом. Если КОП состоит из двух байт, то основным следует считать второй байт кода операции.
В данном справочнике имеются таблицы команд, в которых команды расположены в порядке их кодов операции:
Первый байт кода операций
Второй байт кода операцийВ таблицах справочника в колонке “Формат” основной байт кода операции условно показан в виде восьми черточек, соотвествующих восьми разрядам основного байта.
Это выглядит так: ( ——– ).
Подобное обозначение основного байта есть для каждой команды, так как у каждой команды есть код операции.
Для многих команд в основном байте есть особые биты или битовые поля. Такие места в байте показаны буквами на фоне черточек.
Например, обозначение ( ——-w ) показывает, что в нулевом (самом младшем) разряде основного байта имеется особый бит ( w ), буква “w” означает “word” – “слово”. И это значит, что данная команда имеет два варианта, которые отличаются размером операнда.
Разберем какой-нибудь конкретный случай. Пусть это будет команда ADD с кодами 04 и 05, которая выполняет операцию сложения. Двоичная запись для этих кодов операции выглядит так: 00000100 и 00000101, отличие только в самом младшем разряде.
Здесь вариант команды ADD с кодом 04 ( w = 0 ) выполняет операцию сложения для байта (размер операнда 8 бит), а вариант с кодом 05 ( w = 1 ) выполняет ту же операцию для слова (размер 16 бит).
Но столь просто все было для 16-битных процессоров. С появлением 32-битных ситуация усложнилась. Теперь эта же команда может выполнить свою операцию для байта (8 бит), слова (16 бит), двойного слова (32 бита). Вариант команды с ( w = 0 ) остался прежним, всегда работает только для байта (8 бит). Но работа команды в варианте с ( w = 1 ) будет зависеть от установленного атрибута размера операнда, для слова (16 бит) или для двойного слова (32 бита). Посмотрите выше про префикс изменения размера операнда – код 66, который делает такое переключение для одной команды.
Обозначение ( —–reg ) говорит о том, что прямо в основном байте кода операции задается регистр, для которого эта операция выполняется.
И это значит, что для данной команды имеется восемь разных вариантов с разными кодами операций. Примерами таких команд могут служить однобайтные команды INC и DEC (инкремент и декремент).
Можно посмотреть и с другой стороны, со стороны команд ассемблера. Если для команды INC задается в качестве операнда какой-нибудь регистр, например EAX или EBX, то операнд будет указан прямо в коде операции машинной команды.
Полный список обозначений для особых битов и битовых полей основного байта приведен на странице Пояснения к основным таблицам.
И еще одно замечание про код операции. Код операции – один или два байта в начале команды – можно называть основным кодом операции. Так как бывает еще и дополнительный код операции. Дело в том, что в системе команд x86 имеются довольно много таких случаев, когда основной код операции еще не задает полностью, какая именно операция должна выполняться. В этих особых случаях к основному коду операции присоединяются еще три дополнительных бита. Подробнее об этом рассказано ниже, в разделе “Обозначение NNN”.
Байт MRM – (mod,reg,r/m)
Байт MRM, полное название ( mod,reg,r/m ) – это байт режима адресации.
Полное название выглядит именно так – “байт ( mod,reg,r/m )”. А сокращенное название в разных книгах выглядит по-разному. В нашем справочнике применяется сокращенное название “байт MRM”.
Байт MRM имеется не во всех командах. Это определяется конкретным кодом операции (а говоря точнее, “основным кодом операции”), входит ли байт MRM в состав данной машинной команды или не входит.
Здесь важно заметить, что речь идет не о команде с точки зрения языка ассемблера, а о машинной команде с конкретным основным кодом операции. Например, команда сложения ADD имеет четыре разных варианта с байтом MRM, еще четыре варианта с “сокращенным” байтом MRM, который в нашем справочнике обозначен как NNN, и два варианта вообще без байта MRM. Итого это получается десять разных кодов операции, десять разных вариантов машинной команды. См. страницу Основные команды арифметики.
В таблицах справочника, в колонке “Формат” показано, в составе каких команд есть байт MRM. Причем наличие в колонке “Формат” обозначения MRM или обозначения NNN говорит о том, что в составе команды есть целая группа байтов, относящаяся к MRM. Первым в этой группе идет байт ( mod,reg,r/m ), то есть, собственно байт MRM, затем, если требуется, может идти второй байт режима адресации, это байт SIB, а затем, если требуется, может быть еще и поле для задания адреса.
Байт MRM делится на три битовых поля: двухбитовое поле ( mod ), трехбитовое поле ( reg ), трехбитовое поле ( r/m ).
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
mod | reg | r/m |
Поле ( reg ) определяет первый операнд команды, операнд-приемник (destination). Поле ( r/m ) определяет второй операнд команды, операнд источник (source). Обычно бывает именно такое распределение ролей между ( reg ) и ( r/m ), который из операндов будет источником, а который приемником. Но бывает и наоборот, это зависит от конкретной команды.
Поле ( reg ) задает регистр общего назначения. Три бита – это восемь вариантов, восемь разных регистров.
Поле ( r/m ) задает либо регистр, либо память. Это поле действует совместно с полем ( mod ), вместе будет пять битов и получается 32 варианта, это дает 8 вариантов для задания регистров и 24 варианта для задания формы и режима адресации памяти.
В режиме “32 бита” после байта MRM может стоять еще и второй байт режима адресации – байт SIB, так что количество разных форм задания адреса памяти еще более возрастает.
Обозначение NNN
В системе команд x86 имеются такие команды, в которых байт MRM используется несколько иначе, чем было описано выше. Отличие в том, как трактуется поле ( reg ).
Дело в том, что основной код операции (один байт или два байта) не всегда однозначно определяет, какая это команда. При некоторых значениях основного кода операции к этому коду операции добавляются еще три бита из поля ( reg ) байта MRM. И тогда уже этот рассширенный код операции определяет команду.
Как пример такого случая, можно назвать команды с первым байтом кода операции равным 80, 81, 82, 83. См. страницу Первый байт кода операций.
В таблицах данного справочника для подобных команд ставится обозначение NNN в колонке “Формат” вместо обозначения MRM. Просто нужно было как-то выделить отдельно этот особый случай. Вот и получился “байт NNN” вместо “байта MRM”.
Обозначение NNN показывает, что в команде стоит сокращенный вариант байта MRM, который может задавать только один операнд, вместо прежних двух операндов. Этот операнд определяется полями ( mod ) и ( r/m ), так что операнд может быть либо регистром, либо может иметь одну из многих форм задания адреса в памяти.
В системе команд x86 есть случаи, когда байт MRM применяется в сокращенном виде только из-за того, что для данной конкретной команды не требуется, чтобы байт MRM задавал два операнда, так как в этой команде нужен только один операнд. В этом случае поле ( reg ) байта MRM просто не используется, а в документации оговаривается, что всегда должно быть ( reg = 0 ).
Таких случаев совсем немного:
- команда MOV, коды C6 и C7
- команда POP, код 8F
- группа команд SET(cond), коды от 0F 90 до 0F 9F
Для этих случаев в таблицах справочника тоже ставится обозначение NNN.
Байт SIB – (scale,index,base)
Байт SIB – это второй байт режима адресации.
Байт SIB возможен в команде только в режиме 32 бита и только в том случае, когда в команде уже есть байт MRM (в полной форме или в сокращенной форме NNN).
Этот дополнительный байт для задания режима адресации включается в состав команды только при некоторых определенных значениях в полях ( mod ) и ( r/m ) байта MRM.
Аналогично байту MRM, байт SIB делится на три битовых поля:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
scale | index | base |
Байт SIB позволяет применять еще более сложные формы задания адреса в памяти.
Поле для задания адреса
В этом поле из 1, или 2, или 4 байт, расположенном внутри команды, может быть задан либо полный адрес, либо смещение относительно некоторого адреса.
С точки зрения терминологии, не всегда можно отличить “смещение” от “полного адреса”. Например, как называть полный адрес внутри сегмента, если такой адрес всегда задается смещением от начала сегмента.
Поле задания адреса может по-разному использоваться в разных командах. Однако, рассматривая общую структуру команды, важно различать следующие два случая:
- Если в формат команды входит байт MRM, то поле для задания адреса (если оно есть) является приложением к байту MRM, оно может потребоваться в разных формах задания адреса, применяемых в байте MRM. Причем от кода байта MRM зависит, будет ли в данной машинной команде поле для задания адреса или не будет.
- Если в формате команды нет байта MRM, то поле для задания адреса используется в той конкретной форме, которая предписана для данной конкретной машинной команды.
Эти два разных случая по-разному отражаются в таблицах справочника в колонке “Формат”.
Если в формате команды есть обозначение MRM (или обозначение NNN), то дополнительные байты, относящиеся к байту MRM никак не показываются. Так что поле для задания адреса в этом случае показано не будет.
Если в формате команды нет байта MRM, но есть поле для задания адреса, то в колонке “Формат” будет стоять обозначение “addr (..)“, где в скобках указывается количество байт.
В системе команд x86 невозможен случай, чтобы в некоторой команде оказалось сразу два поля для задания адреса. Поэтому в таблицах справочника невозможен случай, чтобы в колонке “Формат” стояло обозначение MRM (или NNN), а затем еще и обозначение “addr (..)”.
Поле для задания адреса есть не во всех машинных командах.
Непосредственный операнд
Форматы многих команд предусматривают возможность задавать константу непосредственно внутри команды. На языке ассемблера это соответствует заданию для операнда конкретного численного значения вместо имени переменной.
В таблицах справочника в колонке “Формат” наличие непосредственного операнда показано обозначением “data (..)“, где в скобках указывается количество байт.
Поле для непосредственного операнда есть не во всех машинных командах.
Если в формате команды есть поле для задания непосредственного операнда, то это поле в команде всегда будет последним.
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA
, если не указано иное.
Источник