Некоторые архитектуры имеют много разных форм одной и той же мнемоники. Все это должно быть намного легче понять, если посмотреть на пример из такой архитектуры.
например. x86 имеет 5 форм из 32 бит. (Существует так же много форм для 8-битного добавления, за исключением того, что нет 32-битной непосредственной версии. 16 и 64-битные добавления кодируются префиксом байтов перед 32-битными кодировками.)
Формат таблицы: OPCODE и кодирования операндов/Мнемоника/ОПЕРАНДЫ (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
(смотрит вверх кодирование мод/RM байт для операнды в другом порядке оставлены в качестве упражнения для читателя.)
Th e /0
означает, что неиспользуемые биты src-reg в байтах mod/rm заимствованы как часть кода операции. 83 /4 ib
- AND r/m32, imm8
. Когда люди говорят, что машинный код x86 неприятен для декодирования, это то, о чем они говорят (помимо характера переменной длины и того факта, что необязательные байты префикса означают, что код операции не является даже первым байтом ... Вы должны в основном декодировать инструкцию, прежде чем вы даже сможете узнать, как долго начать декодирование следующего. Существует причина, по которой параллельное 4-широкое декодирование инструкций x86 является голодным.)
Более крайний случай является то, что x86 использует mov
для нескольких различных видов команд, определяемых операнды:
- регулярно
mov r32, r/m32
(или наоборот)
- мов-немедленных зарегистрироваться или память
- переместить в/из сегментных регистров (все три из этих форм задокументированы на той же странице в руководстве)
- mov to/from c ontrol (даже в другом руководстве)
- переместить в/из регистров отладки (другая отдельная запись в руководстве).
Я не могу думать о случае, когда две разные мнемоники производят один и тот же код операции. Но одна мнемоника может создавать разные коды операций с разными операндами.
Этот операнд может быть даже закодирован в байтах кода операции для очень часто используемых инструкций, чтобы сэкономить место (это ответ SergeyA). Вы можете представить код операции x86 B8
как mov-imm32-to-eax. (B8
- BF
- все операторы mov-немедленно регистрируются, каждый с другой репутацией.) 32-разрядная x86 имеет однобайтовые коды операций для inc/dec регистра. x86-64 перепрофилировал этот непрерывный диапазон из 16 опкодов для использования в качестве префиксных байтов REX (оставляя двухбайтную форму inc r/m32
как единственный вариант для inc eax
.)
искать мнемонику в словаре: «помощь или предназначение для помощи памяти» , 'add' намного легче запомнить, чем 0x37 или любой другой фактический цифровой код для операции. 'add' - мнемоника, а для 8085' add b' - конкретный код операции, отличный от (скажем) 'add a' или' add c'. –
@MarcB Пожалуйста, дайте мне прямой ответ. –
'ADD' - мнемоника. Код операции - это значение инструкции, которое будет собрано в программу, и его значение будет зависеть от режима адресации (если есть) инструкции. –