一、寄存器的使用惯例
IA32为例子,
%eax, %edx, %ecx ----- 调用者保存的寄存器值 (覆盖)
%ebx, %esi, %edi ------ 被调用者保存的寄存器值(先保存 ,压栈,返回前恢复)
例子:int p(int x)
{
int y = x * x;
int z = Q(y);
return y + z;
}
p : 调用者 Q:被调用者
那么在这里我就想讨论一下,这里的y在哪里存储:
方式一: 存在p自己的栈中,当Q返回时,直接就可以找到y的值。(保存在调用者)
方式二: 存在Q的栈中,如果Q想使用这个寄存器,那么就先吧值存在自己的栈中,然后,当Q的调用结束后,就直接恢复该寄存器的值,y的值就被Q这个函数,给返回来。 (被保存在被调用者)
那么这两个方法计算机会选择那种方式,IA32 都采用,是不是很厉害,他就是将寄存器分为了,调用者保存 --- 被调用者保存。
二、调用过程的栈
void swap(int *x,int *y)
{
int tmp;
int tmp = *x;
*x = *y;
*y = tmp;
}
int call()
{
int arg1 = 534;
int arg2 = 1057;
swap(&arg1,&arg2);
return arg1 - arg2;
}
图示过程: