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