我知道如何将参数传递给用户定义的函数以及如何在这样的函数中创建局部变量。但我想要的是为主函数创建局部变量。
所以主函数是程序启动时执行的第一件事,但是当main开始执行时,esp的初始值是多少?即当main开始执行时堆栈顶部是什么,是命令行参数吗?
如果我想在main中创建局部变量,我应该将esp的值保存到ebp中,然后按照我在用户定义的函数中所需的数据量增加esp吗?
答案 0 :(得分:2)
所以主函数是程序启动时执行的第一件事,但是当main开始执行时,esp的初始值是多少?即当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 */
}
所以,tl;博士:是的。
(注意,即使_start
有一个有效的堆栈指针,但通常没有返回地址,因此最终必须调用exit
系统调用。)