2017-02-10 35 views
-4

Мое понимание - это соглашение о вызове C помещает аргументы в стек перед вызовом функции. Эти аргументы можно было бы получить в рамках функции через явные параметры стека, используя EBP в качестве ссылки, такой как [EBP + 8] или [EBP + 12].Нужны ли локальные переменные?

Вопрос в том, можно ли получить доступ таким образом, зачем нужны локальные переменные? - Не могла ли функция просто работать с аргументами напрямую? Это просто для случаев, когда функция не имеет параметров, но все же инициализирует локальные переменные для внутреннего использования?

+0

Я не совсем понимаю вопрос. Локальные переменные обычно также помещаются в стек, так что нет никакой реальной разницы. Или вы хотите спросить «зачем загружать вещи в регистры процессора, а не каждый раз получать доступ к ним из стека (или других областей памяти)?» – Thilo

+3

Функция может действительно изменить ее параметры, и она делает это точно, как вы говорите. Но что, если функция хочет хранить * дополнительные * данные, которые не передаются в качестве параметра? Тогда ему нужна локальная переменная. Вы спрашиваете в контексте скомпилированного кода C или когда вы вручную записываете сборку? В последнем случае на самом деле нет такой вещи, как «локальная переменная» - просто пространство, выделенное в стеке или в другом месте в памяти. –

ответ

3

Довольно часто функции должны помнить больше данных, чем только параметры. Например, рассмотрим эту функцию подсчета количества установленных битов в качестве аргумента:

int popcount(int k) 
{ 
    int count = 0; 

    while (k != 0) { 
     k &= k - 1; 
     count++; 
    } 

    return (count); 
} 

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