1 对于调用者来说,首先将函数参数从右往左压栈,将函数调用的下一条指令地址压栈(这一操作隐含在call指令中,即执行CALL指令将返回地址压入栈顶)。
2对于调用函数来说: push %ebp, mov %esp %ebp,将调用者的栈的基地址保存,将上一帧的栈顶指针作为下一帧的栈底指针的地址。
3在函数执行完成之后, 执行mov %ebp , %esp , pop %ebp 这样调用者的栈帧也恢复了。
-
参数压栈传递,并且是从右向左依次压栈。
-
ebp
总是指向当前栈帧的栈底。 -
返回值通过
eax
寄存器传递。
void swap(int *a,int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main(void)
{
int a ;
int b ;
int ret;
a =16;
b = 64;
ret = 0;
swap(&a,&b);
ret = a - b;
return ret;
}