В настоящее время я изучаю, как за кулисами выглядит среда выполнения различных языков программирования. Для скомпилированного языка, такого как C, люди обычно дают объяснение: «Код скомпилирован в сборку, которая собрана и связана с двоичным исполняемым файлом. Затем исполняемый файл загружается в память, и ЦП интерпретирует его». Мой вопрос: как ЦП узнает, где искать следующую инструкцию для выполнения? Это адрес памяти, хранящийся в одном из регистров?
Как инструкции машинного кода передаются в ЦП?
Ответы (3)
ЦП не «интерпретирует» машинный код — он выполняет его напрямую — поэтому он называется машинным кодом.
Процессор обычно имеет регистр, называемый Счетчик программ (ПК), который запускается при сбросе в месте, обычно известном как вектор сброса, который либо фиксирован для процессора, либо загружается из фиксированного места и увеличивается до следующей инструкции после выполнения каждой последовательной инструкции без ветвления. Инструкции ветвления и прямого перехода могут привести к тому, что ПК будет установлен на что-то другое, чем последовательный адрес следующей инструкции.
Вы можете наблюдать это поведение, выполняя код на уровне ассемблера в отладчике (отладчик должен иметь возможность отслеживать регистры процессора). Обратите внимание, что ассемблер — это удобочитаемое (более или менее) представление машинного кода, а отладчик показывает дизассемблированный фактический машинный код, а не ассемблер, сгенерированный компилятором — в отладчике один ассемблер инструкция == одна машинная инструкция. Большинство ассемблеров поддерживают макросы и директивы, которые не всегда могут иметь одинаковые отношения один к одному, поэтому даже для кода, который изначально был кодом на ассемблере, дизассемблирование может не всегда быть идентичным исходному коду.
Процесс (известный как цикл инструкций или цикл выборки/выполнения) подробно описан здесь.
Счетчик программ или указатель команд содержит адрес следующей строки.
Существует также кэш инструкций, в котором хранятся коды операций (память), которые, вероятно, вскоре будут выполнены, поэтому прямого доступа к памяти можно избежать.
В большинстве новых процессоров инструкции на самом деле не выполняются по порядку, а вместо этого процессор просто моделирует результат последовательности кодов операций, если бы они выполнялись по порядку. Много информации о том, как это работает, можно почерпнуть из руководств по оптимизации. Я настоятельно рекомендую руководства по адресу http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html, если вы хотите узнайте больше о том, как это делается, пока осваивайте практические навыки.
JMP
, CALL
или RET
, как описано в этом сообщении о переполнении стека: stackoverflow.com/questions/8333413/
- person Colton; 05.06.2014
Расположение первой инструкции указано в техническом описании процессора. Производитель машины гарантирует, что там есть какая-то действующая инструкция (обычно в ПЗУ). Затем выполняется эта первая программа. ЦП знает длину инструкций, поэтому он может сам перейти к следующему местоположению (добавляя длину текущей инструкции к текущему местоположению инструкции). Исключением являются инструкции CALL и JMP, которые направляют в другое место. Но эти инструкции содержат в себе данные, необходимые для вычисления местоположения, к которому они переходят.