Я читал некоторые основные статьи об обработке памяти процессором, и я был в замешательстве относительно того, как процессор обрабатывает то, что будет дальше.Использует ли процессор более одного стека для разделения стека вызовов из стека выражений/регистров?
Концепция стека вызовов понятна, но мне было интересно, является ли стек стека элементов/регистров (используемый для выполнения вычислений) одним и тем же стеком или даже если стек для локальных переменных подпрограммы (a функция) в программе - это тот же стек вызовов.
Если кто-нибудь может объяснить мне, как процессор работает относительно его стека (ов), это мне очень помогло.
Разве это не решение, которое должно быть принято компилятором (в соответствии с условными соглашениями ОС и библиотек)? Процессор будет в порядке с любой конфигурацией памяти, он просто запускает инструкции. Полагаю, вы могли писать код, не используя ни одного стека. – Thilo
@Thilo: Было бы глупо проектировать ABI, который использовал отдельный стек для прокрутки и передачи параметров, если бы ЦП не делал это легко. Например, в x86 он привязал еще один регистр (оставив только 6 из 8 регистров как «общее назначение» в 32-битном режиме), а небольшие и эффективные команды 'push' /' pop' работают только с 'rsp'. Таким образом, сохранение/восстановление регистров в «ручной» стек будет занимать больше байтов кода (и больше инструкций, так как вам придется вручную добавить/добавить к 'rbp' (очевидный выбор для указателя второго стека). –
@PeterCordes: Вероятно, это был ответ, который Рафаэль искал: ЦП должен иметь несколько наборов операций/регистров стека, чтобы эффективно поддерживать несколько стеков (а x86 - нет). – Thilo