寄存器的使用惯例和调用过程的栈

一、寄存器的使用惯例

       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;
}

图示过程:

寄存器的使用惯例和调用过程的栈_第1张图片

    

你可能感兴趣的:(c)