Как процессор «знает», что на самом деле означают команды и инструкции?

73

Как процессор «знает», что означают различные команды?

Я имею в виду команды уровня сборки, такие как MOV, PUSH, CALL и т. Д.

Саймон Вербеке
источник
Это очень информативно, но я ищу то, что позволяет процессору получать и отправлять команды?
Я не понимаю этот комментарий. Процессор «получает» инструкции из памяти, запрашивая их по адресу. Единственные команды, которые ЦП «посылает» (по крайней мере в упрощенном виде), - это команды в память для доставки данных и команды на шинах ввода-вывода для управления устройствами ввода-вывода.
Даниэль Р Хикс
В основе любого процессора лежит какая-то логика, которая (буквально) запрограммирована для выполнения простой процедуры: взять значение из регистра адресов команд, отправить его в память, извлечь инструкцию, которую возвращает память, а затем вставить ее в более сложное гнездо встроенной логики, которая «понимает», что означает инструкция и как ее выполнить. Да, и где-то там увеличиваем регистр адреса инструкции.
Даниэль Р Хикс
Читателей может заинтересовать вопрос, как работает компьютер? по компьютерным наукам .
Рафаэль

Ответы:

88

Когда компьютер интерпретирует инструкции уровня сборки , эти инструкции превращаются в их двоичные эквиваленты для чтения процессором. Когда процессор выполняет инструкции, он интерпретирует часть кода операции в отдельных «микропрограммах», содержащих их эквиваленты микрокода . Точно так же, как вы знаете, полная инструкция по сборке состоит из кода операции и любых применимых данных, которые идут вместе с ним, если это необходимо (например, имена регистров, адреса памяти).

Инструкции микрокода являются чрезвычайно низкоуровневыми (в большей степени, чем сборка) и управляют фактическими цифровыми сигналами, которые управляют потоком логики в микропроцессоре. Например, одна инструкция микрокода может обновить флаг регистра кода состояния новым значением или соединить регистр ЦП с одним из блоков ALU . Возможны более сложные задачи, но это показывает вам общее представление о том, для чего используется микрокод.

Общий поток от компиляции до исполнения выглядит следующим образом. Инструкции по сборке собраны (превращены в их двоичные эквиваленты 0 и 1, или отныне логические сигналы). Эти логические сигналы, в свою очередь, интерпретируются ЦП и превращаются в более логичные сигналы более низкого уровня, которые направляют поток ЦП для выполнения конкретной инструкции. Это может занять один или несколько тактовых циклов, в зависимости от архитектуры и конструкции процессора (в большинстве справочных руководств процессора указано, сколько тактовых циклов требуется для выполнения определенной инструкции, например, этой ).

Все это делается с помощью жестко запрограммированного микрокода (физически встроенного в процессор в каком-то виде ПЗУ , установленного во время производства), который направляет поток через фактические логические элементы низкого уровня . Это обеспечивает интерфейс между абстрактными инструкциями по сборке и физической электрической логикой в ​​процессоре.


Итак, в итоге, инструкции процессора собираются и загружаются процессором. Затем процессор будет использовать эти инструкции для поиска микропрограммы (в форме микрокода), соответствующей этой конкретной инструкции, и именно это «фактически» выполняет инструкцию. Как только микрокоды для конкретной инструкции были выполнены (что может занять один или несколько тактовых циклов), процессор выполняет микрокод для выборки следующей инструкции, и цикл повторяется.

Прорвать
источник
2
Хорошо, я понимаю, я думаю :) Значит, биты команд переключают «переключатели», которые заставляют процессор делать определенные вещи с данными, которые он получает?
Саймон Вербеке
4
@ Симон Вербеке, верно. Они просто переключают переключатели для направления потока электрических сигналов в процессоре (который также может направлять его на повторную загрузку большего количества команд!). Хорошая аналогия с переключателем, поскольку все является цифровым (либо логика 1/0, либо истина / ложь). Просто чтобы вы знали, логический уровень является фактическим напряжением. Инженер должен указать, что такое 0 или 1 (например, логика 1 может быть указана как более 2 вольт).
Прорыв
1
«Двоичные эквивалентные инструкции», к которым компилятор или ассемблер сводит все, называются кодами операций. Если вы посмотрите на структуру кода операции архитектуры RISC, такой как MIPS или ARM, вы увидите, как различные биты кода операции соответствуют определенным операциям. Intel из-за своей долговечности и тенденции к продлению снова и снова больше не имеет простой структуры отображения.
LawrenceC
3
Нет, я говорил из-за долговечности и многократного расширения архитектуры x86, отображение отдельных битов в кодах операций на микрооперации не является аккуратным, как в MIPS или ARM в некоторой степени ( например, см. d.umn.edu/~gshute/spimsal/talref.html , коды операций Intel не имеют ничего общего с этим). Я не думаю , что там было много понятия «РНЦ» , когда Intel представила процессоры x86 в 1978 г.
LawrenceC
5
Следует отметить, что только некоторые процессоры имеют микрокодирование. Некоторые (в основном устройства меньшего размера) работают напрямую с кодами сборки. Это зависит от архитектуры.
Фальшивое имя
37

Процессор не «знает», что это за команды. Команды - это просто двоичные шаблоны, которые заставляют процессор делать то, что мы интерпретируем как команды.

Например, операция ADD-R1-в-R2 приведет к тому, что значения регистров 1 и 2 достигнут ALU (арифметическое и логическое устройство), заставит ALU использовать выход сумматора вместо различных других вещей и вызовет вывод ALU для замены значения в регистре 2. Существуют простые логические схемы для достижения всех этих целей ( мультиплексор , сумматор , счетчик , ...), хотя реальные процессоры используют очень сложные оптимизации.

Это как будто ты спрашиваешь, как машина знает, как тормозить при нажатии на тормоза. Автомобиль не знает, просто педаль тормоза косвенно контролирует, как жесткие колодки прижимаются к колесам.

Крейг Гидни
источник
5
Хорошая аналогия с педалями обрыва машины.
rjmunro
10

Взять, к примеру, инструкцию, которая сообщает процессору x86 / IA-32 о немедленном переносе 8-битного значения в регистр. Двоичный код для этой инструкции - 10110, за которым следует 3-битный идентификатор, для которого используется регистр. Идентификатор для регистра AL равен 000, поэтому следующий машинный код загружает регистр AL с данными 01100001.

10110000 01100001

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

B0 61

Здесь B0 означает «Переместить копию следующего значения в AL», а 61 - шестнадцатеричное представление значения 01100001, что составляет 97 в десятичном виде. Язык ассемблера Intel предоставляет мнемоническое MOV (сокращение от move) для таких инструкций, поэтому приведенный выше машинный код может быть написан на ассемблере следующим образом, если необходимо, после точки с запятой с пояснительным комментарием. Это намного легче читать и запоминать.

http://en.wikipedia.org/wiki/Assembler_language

Другими словами, когда вы «собираете» свою программу сборки, ваши инструкции, такие как

MOV AL, 61h

преобразуются в числа, которые процессор ассоциирует с особым значением, а затем действует соответственно.

Nate
источник
2
Стоит также отметить, что назначение мнемонического символа "mov" для этой конкретной битовой комбинации было совершенно произвольным. В принципе, я мог бы написать ассемблер, который назвал бы эту инструкцию «oof», и она работала бы так же хорошо, кроме того, что было бы труднее запомнить.
dmckee
6

Предлагаемое чтение:

Также ознакомьтесь с примечаниями к курсу из CS152: Компьютерная архитектура и инженерия в Калифорнийском университете в Беркли, курс, на котором студенты реализуют ЦП.

Если вы заглянете в «самодельный процессор», вы найдете много вкусностей.

nibot
источник
4

На крайнем самом низком уровне все, что может сделать процессор, это добавить. Кроме того, он может вычитать, умножать и делить (видя, что это просто сложение по-другому). Процессор использует это для перемещения данных в памяти, применяя дополнения к адресам памяти.

Имейте в виду, что это на самом низком уровне. Процессор фактически «понимает» определенные команды в виде микрокода. Смотрите ответ Прорыв, он очень хорошо написан.

n0pe
источник
7
Логические операции, такие как AND, OR и NOT, а также сдвиг битов являются более фундаментальными, чем сложение. Добавление может фактически быть выражено в терминах этих операций. На самом деле существуют дискретные микросхемы (серия Texas Instruments LS), которые не выполняют ничего, кроме выполнения этих операций, и из них можно создать своего рода ЦП. Google "Схема понг", чтобы увидеть, как, например, сделана игра, без процессора.
LawrenceC
Я имел в виду более программную точку зрения :) Да, аппаратно / логично, если у вас безумное количество шлюзов NAND и NOR. Хорошая точка зрения.
n0pe
2

Я дал соответствующий ответ на сайте programmers.stackexchange.com, см. Как работают компьютеры? где я кратко прошелся по всему с нуля о том, как компьютеры используют интерпретацию инструкций для движущихся электронов.

Ли Райан
источник