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

39494
Simon Verbeke

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

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

71
Это очень информативно, но я ищу то, что позволяет процессору получать и отправлять команды? 13 лет назад 0
I don't understand that comment. A CPU "receives" instructions from memory, by asking for them by address. The only commands a CPU "sends" (in the simplistic view, at least) are commands to the memory to deliver data, and commands on I/O buses, to operate I/O devices. Daniel R Hicks 13 лет назад 0
At the heart of any CPU is some logic that is (literally) hardwired to run a simple procedure: Take the value from the instruction address register, send it to memory, retrieve the instruction that memory returns, and then jam it into a rather more complex nest of hardwired logic that "understands" what the instruction means and how to execute it. Oh, and somewhere along there increment the instruction address register. Daniel R Hicks 13 лет назад 0
Читатели могут быть заинтересованы в вопросе [Как работает компьютер?] (Http://cs.stackexchange.com/q/3390/98) на [cs.SE]. Raphael 11 лет назад 0

6 ответов на вопрос

88
Breakthrough

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

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

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

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


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

Хорошо, я понял, я думаю :) Значит, биты команд переключают «переключатели», которые заставляют процессор делать определенные вещи с данными, которые он получает? Simon Verbeke 13 лет назад 2
@ Симон Вербеке, верно. Они просто переключают переключатели для направления потока электрических сигналов в процессоре (который также может направлять его на повторную загрузку большего количества команд!). Хорошая аналогия с переключателем, поскольку все является цифровым (либо логика 1/0, либо истина / ложь). Просто, чтобы вы знали, логический уровень является фактическим напряжением. Инженер должен указать, что является 0 или 1 (например, логика 1 может быть указана как более 2 вольт). Breakthrough 13 лет назад 4
«Двоичные эквивалентные инструкции», к которым компилятор или ассемблер сводит все, называются кодами операций. Если вы посмотрите на структуру кода операции архитектуры RISC, такой как MIPS или ARM, вы увидите, как различные биты кода операции соответствуют определенным операциям. Intel из-за своей долговечности и тенденции к продлению снова и снова больше не имеет простой структуры отображения. LawrenceC 13 лет назад 1
@ultrasawblade спасибо, это правильно. Я обновил первый абзац в ответе, чтобы правильно отразить это (инструкции - это коды операций и регистры / адреса). Однако я бы сказал, что решение Intel использовать архитектуру [CISC] (http://en.wikipedia.org/wiki/Complex_instruction_set_computer) имеет мало общего с их долговечностью и в большей степени связано с компоновкой их производительности (например, конкретной инструкции по кодированию видео с векторами движения). Breakthrough 13 лет назад 0
Нет, я говорил из-за долговечности и многократного расширения архитектуры x86, отображение отдельных битов в кодах операций на микрооперации не является аккуратным, как в MIPS или ARM в некоторой степени (например, см. http://www.d.umn.edu/~gshute/spimsal/talref.html, коды операций Intel не имеют ничего общего с этим). Я не думаю, что когда-то в 1978 году Intel представила процессоры x86, было много понятия о RISC. LawrenceC 13 лет назад 3
Ах, простите за это неверное истолкование. Кстати, [потрясающий справочный сайт] (http://www.d.umn.edu/~gshute/spimsal/), на который вы ссылались, +1. Breakthrough 13 лет назад 0
Следует отметить, что только ** некоторые ** процессоры имеют микрокодирование. Некоторые (в основном устройства меньшего размера) работают напрямую с кодами сборки. Это зависит от архитектуры. Fake Name 13 лет назад 5
@ Фальшивое имя, да, вы правы - термин, обозначающий это, - это аппаратный процессор (в отличие от микрокодированного, как вы сказали). Для тех, кто хочет узнать больше, [здесь отличный ресурс] (http://foldoc.org/microcode) от удивительного [FOLDOC] (http://foldoc.org/). Breakthrough 13 лет назад 0
Я никогда не слышал "Hard-Wired" раньше. Он всегда был микрокодирован или не микрокодирован, например нормальный. Но потом я работаю исключительно со встроенными микроконтроллерами. Стоит отметить, что процессор, не имеющий микрокодирования, может по-прежнему выполнять несколько тактов для выполнения каждой инструкции. Одно из устройств, с которыми я много работаю, управляет одной инструкцией каждые 4 такта. Fake Name 13 лет назад 0
@ Breakthrough, когда вы говорите «Эти логические сигналы, в свою очередь, интерпретируются процессором», как процессор способен интерпретировать? Это как компьютер в компьютере, бесконечный вопрос! Или когда двоичный код становится «логическим сигналом»? trogne 6 лет назад 0
@trogne what I meant by "interpreted" is the signals are used by logic gates to switch on/off parts of the CPU based on what the signals are, thus accomplishing the "interpretation" of the signals. At the end of the day, there is fundamental gates (XOR, NOR, NAND, AND, OR) executing these particular instructions. Good question :) Breakthrough 6 лет назад 1
37
Craig Gidney

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

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

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

Хорошая аналогия с педалями обрыва машины. rjmunro 13 лет назад 5
10
Nate

Возьмем, к примеру, инструкцию, которая сообщает процессору 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

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

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

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

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

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

4
n0pe

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

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

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

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

Похожие вопросы