【发布时间】:2017-02-10 11:29:19
【问题描述】:
我的理解是 C 调用约定在调用函数之前将参数放在堆栈上。这些参数可以通过显式堆栈参数在函数内访问,使用EBP 作为引用,例如[EBP + 8] 或[EBP + 12]。
我的问题是如果可以这样访问,为什么需要局部变量? - 函数不能直接使用参数吗?是不是只针对函数没有参数,但仍然初始化局部变量供内部使用的情况?
【问题讨论】:
-
我不太明白这个问题。局部变量通常也被放入堆栈,因此没有真正的区别。或者你的意思是问“为什么将东西加载到 CPU 寄存器中,而不是每次都从堆栈(或其他内存区域)访问它们?”
-
一个函数确实可以修改它的参数,而且正如你所说的那样。但是,如果一个函数想要存储未作为参数传递的附加数据怎么办?然后它需要一个局部变量。您是在编译的 C 代码的上下文中询问,还是在手动编写汇编时询问?在后一种情况下,实际上没有“局部变量”之类的东西——只是分配在堆栈或内存其他地方的空间。
标签: assembly x86 masm calling-convention