【发布时间】:2019-02-22 01:47:32
【问题描述】:
让我们有一个函数:
int caller()
{
int arg1 = 1;
int arg2 = 2
int a = test(&arg1, &arg2)
}
test(int *a, int *b)
{
...
}
所以我不明白为什么 &arg1 和 &arg2 也必须像这样被压入堆栈
我可以理解,我们可以通过使用来获取被调用者中arg1和arg2的地址
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
但如果我们不将这两个压入堆栈, 我们也可以使用他们的地址:
leal 8(%ebp), %edx
leal 12(%ebp), %ecx
那么,为什么还要将 &arg1 和 &arg2 推入堆栈呢?
【问题讨论】:
-
如果你再打电话给自己怎么办? 递归函数,你会把所有这些变量放在哪里?
-
为什么你的“函数调用前”图在堆栈上显示
&arg1和&arg2?如果您不调用该函数,则永远不会推送地址,即使在调试版本中也是如此。我猜你是在call指令之前显示状态? -
@PeterCordes 是的,就在调用测试函数之前
-
但这很奇怪,因为你的“之后”图表是在被调用者使用
push %ebp/mov %esp, %ebp制作遗留/调试模式堆栈帧之后,而不是正确之后 i>call指令。 -
@PeterCordes 好的,所以不要担心“之后”的事情,只是想知道为什么 &arg1 和 &arg2 必须被压入堆栈?
标签: c assembly stack instruction-set