Как инструкции машинного кода передаются в ЦП?

В настоящее время я изучаю, как за кулисами выглядит среда выполнения различных языков программирования. Для скомпилированного языка, такого как C, люди обычно дают объяснение: «Код скомпилирован в сборку, которая собрана и связана с двоичным исполняемым файлом. Затем исполняемый файл загружается в память, и ЦП интерпретирует его». Мой вопрос: как ЦП узнает, где искать следующую инструкцию для выполнения? Это адрес памяти, хранящийся в одном из регистров?


person Colton    schedule 05.06.2014    source источник
comment
да, счетчик программ или указатель инструкций (eip на x86)   -  person Steve Cox    schedule 05.06.2014
comment
есть хорошо известная точка входа....   -  person Mitch Wheat    schedule 05.06.2014
comment
Если у вас есть ответ - опубликуйте его как ответ, а не комментарий. stackoverflow.com/help/привилегии/комментарий   -  person Clifford    schedule 08.06.2014


Ответы (3)


ЦП не «интерпретирует» машинный код — он выполняет его напрямую — поэтому он называется машинным кодом.

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

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

Процесс (известный как цикл инструкций или цикл выборки/выполнения) подробно описан здесь.

person Clifford    schedule 05.06.2014
comment
На самом деле большинство процессоров интерпретируют машинный код и преобразуют одну инструкцию машинного кода во множество микроопераций :) www.agner.org/optimize/microarchitecture.pdf (параграф 2.1) - person fjardon; 05.06.2014
comment
@fjardon: я как бы знал, что кто-то поднимет этот вопрос, но это вряд ли актуально, поэтому я решил не усложнять проблему, упоминая ее. Вопрос о том, назвать ли интерпретацию перевода микрокода, спорным. Также это относится к процессорам CISC - я не уверен, что это действительно большинство процессоров, хотя это применимо к x86 (с тегами) - что касается пользователя, инструкция выполняется аппаратно атомарно. - person Clifford; 05.06.2014
comment
большинство процессоров совершенно неверно. Большинство процессоров не микрокодируют, некоторые/немногие делают. - person old_timer; 08.06.2014

Счетчик программ или указатель команд содержит адрес следующей строки.

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

В большинстве новых процессоров инструкции на самом деле не выполняются по порядку, а вместо этого процессор просто моделирует результат последовательности кодов операций, если бы они выполнялись по порядку. Много информации о том, как это работает, можно почерпнуть из руководств по оптимизации. Я настоятельно рекомендую руководства по адресу http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html, если вы хотите узнайте больше о том, как это делается, пока осваивайте практические навыки.

person Steve Cox    schedule 05.06.2014
comment
Чтобы уточнить, Стив Кокс дал правильный ответ. Спасибо Стив за быстрый ответ. Мой следующий вопрос: как изменить указатель инструкций (регистр EIP на Intel x86) на произвольный адрес? Это можно сделать с помощью JMP, CALL или RET, как описано в этом сообщении о переполнении стека: stackoverflow.com/questions/8333413/ - person Colton; 05.06.2014

Расположение первой инструкции указано в техническом описании процессора. Производитель машины гарантирует, что там есть какая-то действующая инструкция (обычно в ПЗУ). Затем выполняется эта первая программа. ЦП знает длину инструкций, поэтому он может сам перейти к следующему местоположению (добавляя длину текущей инструкции к текущему местоположению инструкции). Исключением являются инструкции CALL и JMP, которые направляют в другое место. Но эти инструкции содержат в себе данные, необходимые для вычисления местоположения, к которому они переходят.

person fjardon    schedule 05.06.2014
comment
Спасибо фьярдон! Это также правильный ответ, и ваше разъяснение о первой выполняемой инструкции, указанной в таблице данных ЦП, было действительно полезным! - person Colton; 05.06.2014