Добавить в корзинуПозвонить
Найти в Дзене
Будни инженера

Код операции и машинный код: это одно и то же или нет? Объясняю на пальцах

Привет, коллега! Если ты начал осваивать микроконтроллеры (например, семейства PIC, AVR или STM), то обязательно столкнешься с двумя словами: «машинный код» и «код операции». Часто новички думают, что это одно и то же. Мол, то, что железо выполняет, и есть машинный код. Но это не совсем так. Давайте разберемся, в чем тут тонкая разница. Это важно, чтобы понимать, как на самом деле работает процессор без всякого волшебства. Представь себе толстую книгу инструкций для робота. В этой книге — тысячи страниц. А машинный код — это просто одна единственная строчка из этой книги. Это конкретная команда, которую процессор способен понять и выполнить прямо сейчас. У процессора очень бедный словарный запас (всего несколько десятков или сотен команд). Машинный код — это такие команды, состоящие только из нулей и единиц (например, 10110000 01100001). Мы, люди, их обычно записываем в виде шестнадцатеричных чисел (0xB0, 0x61), чтобы было короче. Это кирпичик. Самая мелкая единица программы с точки зр
Оглавление

Привет, коллега! Если ты начал осваивать микроконтроллеры (например, семейства PIC, AVR или STM), то обязательно столкнешься с двумя словами: «машинный код» и «код операции». Часто новички думают, что это одно и то же. Мол, то, что железо выполняет, и есть машинный код.

Но это не совсем так. Давайте разберемся, в чем тут тонкая разница. Это важно, чтобы понимать, как на самом деле работает процессор без всякого волшебства.

Что такое машинный код?

Представь себе толстую книгу инструкций для робота. В этой книге — тысячи страниц. А машинный код — это просто одна единственная строчка из этой книги. Это конкретная команда, которую процессор способен понять и выполнить прямо сейчас.

У процессора очень бедный словарный запас (всего несколько десятков или сотен команд). Машинный код — это такие команды, состоящие только из нулей и единиц (например, 10110000 01100001). Мы, люди, их обычно записываем в виде шестнадцатеричных чисел (0xB0, 0x61), чтобы было короче.

Это кирпичик. Самая мелкая единица программы с точки зрения процессора.

Компиляторы и ассемблеры переводят языки программирования в машинные коды, чтобы программисту было проще создавать программы, а процессор мог эти программы выполнять.

Что такое код операции (опкод)?

А вот тут начинается магия. Если машинный код — это целая команда (кирпич), то код операции — это часть этого кирпича.

Любая команда процессора обычно говорит ему:

  1. Что сделать? (Сложить, вычесть, переместить, сравнить).
  2. С кем или с чем сделать? (С какими числами или ячейками памяти).

Так вот, «код операции» (или opcode, от англ. Operation Code) — это та самая часть команды, которая отвечает на вопрос «ЧТО делать?».

Вторая часть называется «операнд» (от слова «операция»). Это данные или адрес ячейки, над которыми работаем.

А код операции + операнд = машинный код.

Пример для наглядности

Допустим, у нас есть примитивный «детский» процессор. Его команда машинного кода выглядит как один байт (8 бит), например: 0010 0001.

Разделим этот байт мысленно на две части:

  • Первые 4 бита (0010) — это код операции. Запомним: "0010" для нашего процессора означает команду «Сложить».
  • Вторые 4 бита (0001) — это операнд. Допустим, это число 1.

Что получили?
Машинная команда 0010 0001 целиком говорит железу: "Возьми текущее значение и прибавь к нему единицу". Оба следующих утверждения верны:

  • Вся восьмибитная последовательность — это машинный код (конкретная инструкция).
  • Первая её половинка (0010) — это код операции (вид действия).

Теперь главный вывод: В чем же разница?

Это разные вещи, которые соотносятся как целый забор и одна доска (или как целый пирог и один ингредиент).

  • Код операции — это только «глагол». Указание на действие.
  • Машинный код — это целое предложение с «глаголом + существительным» (например, «прибавь 1»).

Почему тебе, как начинающему, важно это знать?

  1. Когда смотришь дизассемблер. Если ты откроешь прошивку в программе вроде IDA или Ghidra, ты увидишь столбцы машинных кодов. Разбирая их, важно понять, где граница между «что делать» (опкод) и «с чем делать» (операнд). От этого зависит, как ты поймешь алгоритм.
  2. Когда пишешь на Ассемблере. Когда ты пишешь MOV R0, 5 (перенести число 5 в регистр R0), то ассемблер сам превратит MOV в код операции (допустим, 0x01 - зависит от конкретного процессора), а R0, 5 — в операнды (ещё несколько байт). На выходе получится тот самый машинный код, который и заставит бегать электрические сигналы по ножкам микроконтроллера.

Простое мнемоническое правило:

Представь, что твой микроконтроллер — это очень глупый, но послушный кот.

  • Код операции — это жест пальцем или команда голосом: «Сидеть!», «Лежать!», «Голос!».
  • Машинный код — это конкретное приказание: «Сидеть на коврике у двери 30 секунд».

Без кода операции не ясно, что делать. А без машинного кода (который включает в себя и код операции, и данные) непонятно, как именно и с кем это делать.

Короткое резюме (для тех, кто хочет запомнить главное):

  • Код операции — это часть машинного кода, отвечающая за действие.
  • Машинный код — это полная команда процессора, включающая код операции и операнды.
  • Одно и то же? Нет.

Запомни эту разницу — и тебе будет гораздо легче читать документацию на микроконтроллеры, где часто отдельной табличкой расписано, сколько бит отведено под опкод, а сколько под операнды для разных команд. Успехов в освоении “железа”…

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить…