Мое понимание - это соглашение о вызове C помещает аргументы в стек перед вызовом функции. Эти аргументы можно было бы получить в рамках функции через явные параметры стека, используя EBP
в качестве ссылки, такой как [EBP + 8]
или [EBP + 12]
.Нужны ли локальные переменные?
Вопрос в том, можно ли получить доступ таким образом, зачем нужны локальные переменные? - Не могла ли функция просто работать с аргументами напрямую? Это просто для случаев, когда функция не имеет параметров, но все же инициализирует локальные переменные для внутреннего использования?
Я не совсем понимаю вопрос. Локальные переменные обычно также помещаются в стек, так что нет никакой реальной разницы. Или вы хотите спросить «зачем загружать вещи в регистры процессора, а не каждый раз получать доступ к ним из стека (или других областей памяти)?» – Thilo
Функция может действительно изменить ее параметры, и она делает это точно, как вы говорите. Но что, если функция хочет хранить * дополнительные * данные, которые не передаются в качестве параметра? Тогда ему нужна локальная переменная. Вы спрашиваете в контексте скомпилированного кода C или когда вы вручную записываете сборку? В последнем случае на самом деле нет такой вещи, как «локальная переменная» - просто пространство, выделенное в стеке или в другом месте в памяти. –