Как создать локальные переменные внутри основной функции?

Я знаю, как передавать параметры пользовательской функции и как создавать локальные переменные внутри такой функции. Но я хочу создать локальные переменные для основной функции.

Таким образом, функция main — это первое, что выполняется при запуске программы, но каково начальное значение esp, когда начинается выполнение main? то есть что находится на вершине стека, когда main начинает выполняться, это аргументы командной строки?

Если я хочу создать локальные переменные внутри main, должен ли я сохранить значение esp в ebp, а затем увеличить esp на то количество данных, которое мне нужно, точно так же, как я делаю внутри определяемой пользователем функции?


person Community    schedule 24.12.2014    source источник


Ответы (1)


Таким образом, функция main — это первое, что выполняется при запуске программы, но каково начальное значение esp, когда начинается выполнение main? то есть что находится на вершине стека, когда main начинает выполняться, это аргументы командной строки?

main вызывается как обычная функция, поэтому (с соглашением о вызовах cdecl) самыми верхними элементами являются, сверху вниз (необязательно) указатель среды, затем указатель на массив указателей строки аргумента, затем argc, затем обратный адрес main.

Если я хочу создать локальные переменные внутри main, должен ли я сохранить значение esp в ebp, а затем увеличить esp на то количество данных, которое мне нужно, точно так же, как я делаю внутри определяемой пользователем функции?

main является пользовательской функцией. Вызывается из crt0.o (название может отличаться в зависимости от операционной системы) из примерно такого кода:

void
_start(void)
{
    /* initialisation skipped */
    int rv = main(newargc, newargv, environ);
    do_global_dtors();
    exit(rv);
    /* NOTREACHED */
}

Итак, вкратце: да.

(Обратите внимание, что даже _start имеет действительный указатель стека, но обычно не имеет адреса возврата, поэтому в конечном итоге он должен вызвать системный вызов exit.)

person mirabilos    schedule 24.12.2014
comment
Обратите внимание, что даже для реальной точки входа указатель стека действителен, поэтому вы можете выделить локальные элементы точно так же. - person Jester; 24.12.2014