2016-01-21 9 views
0

В языке ассемблера по набору инструкций микропроцессора 8085 предположим, что у нас есть следующая операция ADD B.
Я знаю, что это означает «Добавить данные регистра B в регистр Аккумулятора и сохранить содержимое обратно в Аккумулятор».

В чем разница между Mnemonics и Opcode

  • Вот что мнемонические и что опкод.

  • ADD (только ADD, а не ADD B) - это код операции или мнемоника?

  • Внутренние мемономы преобразуются в шестнадцатеричные коды, такие как 3E, поэтому здесь этот шестнадцатеричный код относится к ADD или ADD B.
    Просьба помочь.
+0

искать мнемонику в словаре: «помощь или предназначение для помощи памяти» , 'add' намного легче запомнить, чем 0x37 или любой другой фактический цифровой код для операции. 'add' - мнемоника, а для 8085' add b' - конкретный код операции, отличный от (скажем) 'add a' или' add c'. –

+0

@MarcB Пожалуйста, дайте мне прямой ответ. –

+0

'ADD' - мнемоника. Код операции - это значение инструкции, которое будет собрано в программу, и его значение будет зависеть от режима адресации (если есть) инструкции. –

ответ

2

Обычно код операции относится к типу операции (ADD), а регистр B является операндом. Однако с фиксированным и небольшим количеством операндов одна и та же операция может иметь другой код операции для всех возможных операндов.

+0

Просьба ответить в отношении контекста вопроса, например, в отношении мнемоники и кода операции здесь. –

+0

Точно что неясно в моем ответе? – SergeyA

+0

Что мнемоника и код операции в «ADD B». И шестнадцатеричные коды предназначены для мнемоники или опкодов? –

1

Код операции относится к двоичной последовательности, которая идентифицирует инструкцию. Итак, для 8085 я считаю, что 0x80 будет кодом операции для «ADD B»

Мнемоника - это читаемое человеком имя, которое поможет вам запомнить инструкции. Таким образом, строка «ADD B» является мнемонической для 0x80. «ADD B» намного легче запомнить, чем 0x80.

+0

Но это точно противоположно тому, что говорили выше. –

2

Некоторые архитектуры имеют много разных форм одной и той же мнемоники. Все это должно быть намного легче понять, если посмотреть на пример из такой архитектуры.

например. 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.)