Как процессор «знает», что означают различные команды?
Я имею в виду команды уровня сборки, такие как MOV, PUSH, CALL и т. Д.
Как процессор «знает», что означают различные команды?
Я имею в виду команды уровня сборки, такие как MOV, PUSH, CALL и т. Д.
Ответы:
Когда компьютер интерпретирует инструкции уровня сборки , эти инструкции превращаются в их двоичные эквиваленты для чтения процессором. Когда процессор выполняет инструкции, он интерпретирует часть кода операции в отдельных «микропрограммах», содержащих их эквиваленты микрокода . Точно так же, как вы знаете, полная инструкция по сборке состоит из кода операции и любых применимых данных, которые идут вместе с ним, если это необходимо (например, имена регистров, адреса памяти).
Инструкции микрокода являются чрезвычайно низкоуровневыми (в большей степени, чем сборка) и управляют фактическими цифровыми сигналами, которые управляют потоком логики в микропроцессоре. Например, одна инструкция микрокода может обновить флаг регистра кода состояния новым значением или соединить регистр ЦП с одним из блоков ALU . Возможны более сложные задачи, но это показывает вам общее представление о том, для чего используется микрокод.
Общий поток от компиляции до исполнения выглядит следующим образом. Инструкции по сборке собраны (превращены в их двоичные эквиваленты 0 и 1, или отныне логические сигналы). Эти логические сигналы, в свою очередь, интерпретируются ЦП и превращаются в более логичные сигналы более низкого уровня, которые направляют поток ЦП для выполнения конкретной инструкции. Это может занять один или несколько тактовых циклов, в зависимости от архитектуры и конструкции процессора (в большинстве справочных руководств процессора указано, сколько тактовых циклов требуется для выполнения определенной инструкции, например, этой ).
Все это делается с помощью жестко запрограммированного микрокода (физически встроенного в процессор в каком-то виде ПЗУ , установленного во время производства), который направляет поток через фактические логические элементы низкого уровня . Это обеспечивает интерфейс между абстрактными инструкциями по сборке и физической электрической логикой в процессоре.
Итак, в итоге, инструкции процессора собираются и загружаются процессором. Затем процессор будет использовать эти инструкции для поиска микропрограммы (в форме микрокода), соответствующей этой конкретной инструкции, и именно это «фактически» выполняет инструкцию. Как только микрокоды для конкретной инструкции были выполнены (что может занять один или несколько тактовых циклов), процессор выполняет микрокод для выборки следующей инструкции, и цикл повторяется.
Процессор не «знает», что это за команды. Команды - это просто двоичные шаблоны, которые заставляют процессор делать то, что мы интерпретируем как команды.
Например, операция ADD-R1-в-R2 приведет к тому, что значения регистров 1 и 2 достигнут ALU (арифметическое и логическое устройство), заставит ALU использовать выход сумматора вместо различных других вещей и вызовет вывод ALU для замены значения в регистре 2. Существуют простые логические схемы для достижения всех этих целей ( мультиплексор , сумматор , счетчик , ...), хотя реальные процессоры используют очень сложные оптимизации.
Это как будто ты спрашиваешь, как машина знает, как тормозить при нажатии на тормоза. Автомобиль не знает, просто педаль тормоза косвенно контролирует, как жесткие колодки прижимаются к колесам.
Взять, к примеру, инструкцию, которая сообщает процессору 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
преобразуются в числа, которые процессор ассоциирует с особым значением, а затем действует соответственно.
Предлагаемое чтение:
Также ознакомьтесь с примечаниями к курсу из CS152: Компьютерная архитектура и инженерия в Калифорнийском университете в Беркли, курс, на котором студенты реализуют ЦП.
Если вы заглянете в «самодельный процессор», вы найдете много вкусностей.
На крайнем самом низком уровне все, что может сделать процессор, это добавить. Кроме того, он может вычитать, умножать и делить (видя, что это просто сложение по-другому). Процессор использует это для перемещения данных в памяти, применяя дополнения к адресам памяти.
Имейте в виду, что это на самом низком уровне. Процессор фактически «понимает» определенные команды в виде микрокода. Смотрите ответ Прорыв, он очень хорошо написан.
Я дал соответствующий ответ на сайте programmers.stackexchange.com, см. Как работают компьютеры? где я кратко прошелся по всему с нуля о том, как компьютеры используют интерпретацию инструкций для движущихся электронов.