awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Инструкция

Суть Инструкция — наименьшая команда, которую CPU способен выполнить. Каждая инструкция называет операцию (что делать) и операнды (над чем делать). Полное множество инструкций, которые понимает CPU, — это его система команд.
◷ 18 min

Ты пишешь строку кода, и компьютер что-то делает: складывает два числа, сохраняет значение, переходит к другому месту программы. Но CPU не понимает Python, JavaScript или C. Он понимает только одно: крошечный, фиксированный словарь предельно простых команд, которые называются инструкциями. Всё программное обеспечение — от браузера до игрового движка и операционной системы — сводится к последовательности этих крошечных команд прежде, чем CPU сможет их выполнить.

Что именно такое одна инструкция? Как она выглядит и что способна делать?

Цель

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

1

Инструкция — это одна неделимая команда. Инструкция CPU — наименьшая единица работы, которую CPU выполняет как один неделимый шаг. CPU читает инструкцию, делает ровно то, что в ней сказано, и переходит к следующей. Он не разбивает инструкцию на более мелкие части — инструкция уже является наименьшей частью.

Представь карточку с рецептом, написанную для предельно буквального робота. На каждой карточке написано ровно одно: «Добавь муку в миску», «Установи духовку на 180 °C», «Если тесто комковатое, вернись к шагу 3». Робот не может импровизировать. Он точно выполняет каждую карточку и затем смотрит на следующую. Инструкции CPU работают так же, только каждая карточка занимает наносекунды, а не секунды.

2

Инструкция = операция + операнды. Каждая инструкция состоит из двух частей:

  • Операция (её также называют опкодом, от operation code — код операции) говорит что делать. Примеры: ADD (сложить), SUBTRACT (вычесть), LOAD (прочитать из памяти), STORE (записать в память), JUMP (перейти к другой инструкции).

  • Операнды говорят над чем делать. Это входные данные, которые нужны операции. ADD нужны два числа. LOAD нужен адрес для чтения. JUMP нужен адрес следующей инструкции.

Инструкция без операндов встречается редко, но возможна (например, инструкция HALT, останавливающая CPU, не требует входных данных).

В неформальной записи инструкции выглядят так:

ADD  R0, R1        ; сложить значение в слоте R0 со значением в слоте R1
LOAD R0, 100       ; прочитать байт по адресу памяти 100 в слот R0
STORE 200, R1      ; записать значение из слота R1 по адресу памяти 200
JUMP 50            ; следующей выполнить инструкцию по адресу 50

Здесь R0 и R1регистры: маленькие, сверхбыстрые ячейки хранения внутри CPU (ты подробно узнаешь о них в следующих уроках). Пока что считай их именованными ящиками, которые хранят значение.

3

Три семейства инструкций. В реальных системах команд много инструкций, но почти все они принадлежат одному из трёх семейств:

1. Арифметические и логические инструкции. Они вычисляют результат из одного или двух значений. Типичные примеры: ADD, SUBTRACT, MULTIPLY, AND, OR, NOT, SHIFT (сдвиг битов влево или вправо). Входные данные и результат хранятся в регистрах. Внутри CPU есть небольшая схема, называемая Арифметико-логическим устройством (АЛУ), которая выполняет эти вычисления.

2. Инструкции работы с памятью. Они перемещают данные между регистрами и памятью. Инструкция LOAD читает значение из адреса памяти в регистр. Инструкция STORE записывает значение из регистра по адресу памяти. Это единственный способ доставить данные из большой, но медленной памяти в быстрый CPU и обратно.

3. Инструкции управления потоком. Они меняют, какая инструкция выполняется следующей. Обычно после завершения одной инструкции CPU переходит к следующей по порядку (последовательное выполнение). Инструкция JUMP переопределяет это: она устанавливает следующей инструкцию по указанному адресу. Условный JUMP (также называемый ветвлением) выполняет прыжок только при выполнении условия (например, «перейти по адресу 80, если последний результат был равен нулю»). Ветвления — это то, как операторы if и циклы реализуются в аппаратуре.

Почему это работает

Зачем такой маленький, фиксированный словарь? Система команд реализована непосредственно в аппаратуре — кремниевые схемы декодируют каждый опкод и направляют сигналы в нужные части чипа. Построить схемы для огромного, гибкого словаря означало бы сделать чип огромным, медленным и энергозатратным. Вместо этого разработчики CPU выбирают небольшой набор простых, компонуемых операций. Сложное поведение (сортировка списка, рендеринг пикселя) строится путём объединения многих тысяч простых инструкций. Компилятор или интерпретатор — это программа, которая выполняет этот перевод.

4

Система команд: полный словарь CPU. Полная совокупность инструкций, которые понимает конкретная модель CPU, называется её системой команд (более формально — архитектурой системы команд, или ISA от Instruction Set Architecture). Разные семейства CPU имеют разные системы команд:

  • x86-64 — система команд, используемая чипами Intel и AMD в большинстве ноутбуков и настольных компьютеров.
  • ARM (AArch64) — система команд, используемая чипами в iPhone, Android-смартфонах и Mac на Apple Silicon.
  • RISC-V — более новая открытая система команд, применяемая во встроенных системах и в исследованиях.

Программа, скомпилированная для x86-64, не может запуститься напрямую на чипе ARM, потому что два чипа не используют одну систему команд. Система команд — это контракт между программным обеспечением и аппаратурой.

Каждая система команд имеет свою кодировку — определённый паттерн битов, представляющий каждую инструкцию в памяти. Ты увидишь это подробно в уроке о машинном коде.

Частая ошибка

Распространённое заблуждение: CPU «понимает» языки программирования. Это не так. CPU понимает только битовые паттерны своей системы команд. Python, JavaScript, C и любой другой язык должны быть переведены — скомпилированы или интерпретированы — в систему команд CPU, прежде чем тот сможет их выполнить. Какой бы высокоуровневый код ты ни написал, к моменту запуска на чипе он сведён к последовательности простых инструкций ADD, LOAD, STORE, JUMP и подобных.

LOAD
оп
R0
куда
100
адр
ADD
оп
R0
куда
R1
ист
STORE
оп
200
куда
Три инструкции в виде ячеек. Выделенные ячейки образуют инструкцию LOAD: операция=LOAD, регистр-назначение=R0, адрес памяти=100. Следом — инструкции ADD и STORE.
Разбор примера

Разбор частей инструкции.

Рассмотрим инструкцию:

ADD  R2, R0, R1
  • Операция: ADD — опкод, сообщающий CPU выполнить сложение.
  • Операнды: R2, R0, R1 — три регистра. Инструкция означает: «сложи значение из R0 со значением из R1 и запиши результат в R2».

Теперь рассмотрим:

STORE 500, R2
  • Операция: STORE — записать значение из регистра в память.
  • Операнды: адрес 500 и регистр R2. Означает: «записать то, что находится в R2, в ячейку памяти по адресу 500».

И наконец:

JUMP  80
  • Операция: JUMP — перенаправить выполнение.
  • Операнд: адрес 80. Означает: «сделать следующей инструкцией ту, что хранится в памяти по адресу 80». Без этой инструкции CPU перешёл бы к следующей по порядку.

Во всех трёх случаях структура одинакова: один опкод, за ним входные данные, которые нужны этой операции.

Практика 0 / 5

Инструкция состоит из двух основных частей: операции и ___. Сколько основных частей у инструкции? Введи число.

Какое семейство инструкций отвечает за чтение значения из адреса памяти в CPU? Введи 1 (арифметические), 2 (работа с памятью) или 3 (управление потоком).

Инструкция JUMP меняет адрес следующей выполняемой инструкции. Без JUMP CPU выполняет инструкции в каком порядке? Введи 1 (последовательно, одну за другой) или 2 (случайно).

Полное множество инструкций, которые понимает модель CPU, называется её системой ___. Сколько букв в пропущенном слове? (Подсказка: это слово «команд».) Введи число.

Скомпилированная для x86-64 программа может напрямую запуститься на чипе ARM без перевода. Введи 1 (верно) или 0 (неверно).

Проверь себя
Викторина

В чём разница между операцией и операндами инструкции?

Итог

Инструкция CPU — наименьшая неделимая команда, которую CPU способен выполнить. Каждая инструкция состоит из операции (опкода), называющей действие, и нуля или более операндов, которые передают входные данные. Инструкции делятся на три основных семейства: арифметические и логические (вычисляют значения), инструкции работы с памятью (LOAD и STORE перемещают данные между регистрами и памятью) и инструкции управления потоком (JUMP и ветвления меняют, какая инструкция выполняется следующей). Полное множество инструкций, которые понимает модель CPU, — это её система команд (или Instruction Set Architecture, ISA). Разные семейства CPU используют разные системы команд, и программное обеспечение должно быть переведено в правильную систему команд, прежде чем CPU сможет его выполнить.

Продолжить восхождение ↑Выборка–Декодирование–Исполнение
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.