0

Я читал некоторые основные статьи об обработке памяти процессором, и я был в замешательстве относительно того, как процессор обрабатывает то, что будет дальше.Использует ли процессор более одного стека для разделения стека вызовов из стека выражений/регистров?

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

Если кто-нибудь может объяснить мне, как процессор работает относительно его стека (ов), это мне очень помогло.

+0

Разве это не решение, которое должно быть принято компилятором (в соответствии с условными соглашениями ОС и библиотек)? Процессор будет в порядке с любой конфигурацией памяти, он просто запускает инструкции. Полагаю, вы могли писать код, не используя ни одного стека. – Thilo

+1

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

+0

@PeterCordes: Вероятно, это был ответ, который Рафаэль искал: ЦП должен иметь несколько наборов операций/регистров стека, чтобы эффективно поддерживать несколько стеков (а x86 - нет). – Thilo

ответ

2

Все процессоры, над которыми я работал, только использовали для них один стек.

Если вы думаете о том, что делает процессор, вам нужен только один стек. Во время вычислений вы можете использовать тот же стек, что и вызывающий стек, так как при завершении расчета стек снова будет «чистым». То же самое касается локальных переменных, перед тем как выйти из области локальных переменных, ваш стек будет чистым, позволяя правильному возврату вызова.

1

Вы можете изменить стек, просто установите сегмент SS: SP и регистры указателя (просто сохраните текущие значения) Параметры вызова процедуры и локальные переменные происходят в стеке. И динамически созданные объекты имеют место в куче (DS: DI). Папка регистра SS: SP сдвигается на нужное количество байтов для резервирования необходимой памяти при вызове процедуры. И по возвращении SS: SP возвращается в состояние предварительного вызова.

Смежные вопросы