编程范式 10 笔记 函数栈帧

int foo(int bar,int* baz)
{
 char snink[4];
 short* why;
 why=(short *)(snink+2);
 *why=50;
 return 0;
 }

栈信息:
baz
bar
存储调用函数的某些信息,谁调用了它
char snink[4]
short* why

int main(int argc, char** argv)
{
    int i=4;//SP=SP-4,M[sp]=4;
    foo(i,&i);//SP=SP-8
    //R1=M[SP+8]
    //R2=SP+8
    //RV RV用来传递返回值
    //M[SP]R1;
    //M[SP+4]=R2;
    //CALL<foo>
    //SP=SP+8这个值就是saved pc
    return 0;
}

栈信息:
argc
argv
Saved PC

foo:

<foo>
SP=SP-8//为局部变量留空间
//没有初始化
R1=SP+6;//(short *)(snink+2)
M[SP]=R1;//why=(short *)(snink+2)
M[R1]=.2 50;
SP=SP+8//现在SP指向返回地址
RET;//return 这条指令把SP的值取出来放到PC,然后SP+=4
int fact(int n)
{
    if(n==0)
        return 1;
    return n*fact(n-1);
}
<fact>
R1=M[SP+4];
BNE R1,0,PC+12//每条指令4B BNE=Branch on Not Equal
RV=1;
RET;
R1=M[SP+4];
R1=R1-1;
SP=SP-4;
M[SP]=R1;
CALL<fact>;
SP=SP+4
R1=M[SP+4]
RV*R1;
RV
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值