В чем разница между мнемоникой и кодом операции
На языке ассемблера под набором инструкций микропроцессора 8085, предположим, у нас есть следующая операция ADD B
,
Я знаю, что это означает "Добавить данные регистра B в регистр Аккумулятора и сохранить содержимое обратно в Аккумулятор".
Вот что такое мнемоника и что такое код операции.
ADD
(только ДОБАВИТЬ, а неADD B
) это код операции или мнемоника?- Внутренне мнемоника преобразуется в шестнадцатеричные коды, такие как 3E, так что здесь, на что ссылается этот шестнадцатеричный код,
ADD
или жеADD B
,
Пожалуйста, помогите.
3 ответа
Обычно код операции относится к типу операции (ADD), а регистр B является операндом. Однако при фиксированном и небольшом количестве операндов одна и та же операция может иметь разные коды операций для всех возможных операндов.
Код операции относится к двоичной последовательности, которая идентифицирует инструкцию. Так что для 8085 я считаю, что 0x80 будет кодом операции "ADD B"
Мнемоника - это удобочитаемое имя, которое помогает вам запомнить инструкции. Таким образом, строка "ADD B" является мнемоникой для 0x80. "ADD B" намного легче запомнить, чем 0x80.
Некоторые архитектуры имеют много разных форм одной и той же мнемоники. Вещи должны быть намного легче понять, глядя на пример из такой архитектуры.
например, x86 имеет 5 форм 32-битного сложения. (Существует так же много форм для 8-битного сложения, за исключением, конечно, что нет 32-битной немедленной версии. 16 и 64-битные дополнения кодируются байтами префикса перед 32-битными кодировками.)
Формат таблицы: OPCODE и кодирование операнда / MNEMONIC / OPERANDS (dest, src)
05 id ADD EAX, imm32 # special-case save-one-bye for adding to the accumulator
81 /0 id ADD r/m32, imm32
83 /0 ib ADD r/m32, imm8
03 /r ADD r32, r/m32 # src can be memory
01 /r ADD r/m32, r32 # dest can be memory
Таким образом, для add eax, edx
Есть две возможные кодировки: 01 D0
(выбрано GNU как) или 03 whatever
(поиск кодировки байта mod/rm для операндов в другом порядке оставлен в качестве упражнения для читателя.)
/0
означает, что неиспользуемые биты src-reg в байте mod/rm заимствованы как часть кода операции. 83 /4 ib
является AND r/m32, imm8
, Когда люди говорят, что машинный код x86 неприятен для декодирования, это то, о чем они говорят (помимо природы переменной длины и того факта, что необязательные байты префикса означают, что код операции даже не является первым байтом... В основном вам нужно декодировать инструкцию, прежде чем вы сможете узнать, сколько времени потребуется для начала декодирования следующей. Существует причина, по которой параллельное декодирование инструкций x86 по всей ширине требует много энергии.)
Более крайним случаем является то, что x86 использует mov
для нескольких различных видов команд, определенных операндами:
- регулярный
mov r32, r/m32
(или наоборот) - MOV-немедленный, чтобы зарегистрироваться или память
- Перемещение в / из сегментных регистров (все три из этих форм описаны на одной странице в руководстве)
- Перемещение в / из контрольных регистров (даже в руководстве есть другая запись)
- Перемещение в / из регистров отладки (еще одна отдельная запись в руководстве).
Я не могу вспомнить случай, когда две разные мнемоники выдают один и тот же код операции. Но одна мнемоника может создавать разные коды операций с разными операндами.
Операнд может даже быть закодирован в байт операционного кода для очень часто используемых инструкций, чтобы сэкономить место (это ответ SergeyA). Вы могли бы подумать о х86 B8
код операции как mov-imm32-to-eax. (B8
в BF
все коды операций являются mov-немедленными для регистрации, каждый с разным регистром назначения. 32-битный x86 имеет однобайтовые коды операций для inc/dec регистров. x86-64 переназначил этот непрерывный диапазон из 16 кодов операций для использования в качестве байтов префикса REX (оставляя двухбайтовый inc r/m32
Форма как единственный вариант для inc eax
.)