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

一、寄存器的使用惯例

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

图示过程:



    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值