该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先你的main函数调用printN,作为调用者他会做这么几件事
1.将参数10压栈;
2.将Return Address压栈,即第19行的地址;
3.跳转到函数体;
在函数体中,作为被调用者他会做这么几件事:
......初始化操作......
if N != 0
将N-1压栈,
将Return Address压栈,即第6行的地址,
然后跳转到函数体;
打印N的值;
else
......恢复操作.....
函数返回;
当N=0时,栈帧类似下面的情况:
------------------------
saved ebp(下方栈帧的ebp地址)
------------------------
return address
------------------------
N=0
------------------------
saved ebp (下方栈帧的ebp地址)
------------------------
return address (EBP+4)
------------------------
N=1 (EBP+8)
------------------------
.....
------------------------
saved ebp
------------------------
return address
------------------------
N=9
------------------------
saved ebp (main函数栈帧的ebp地址)
------------------------
return address
------------------------
N=10
------------------------
....
------------------------
当N=0时,并且if执行完成后,会:
1.恢复esp(销毁局部变量),弹出ebp(ebp为下面栈帧的地址);
2.跳转到返回地址
然后执行返回地址+1处的代码,打印出N=1(因为ebp已经恢复,参数就是EBP+8这个位置的元素 );
...依次类推...
最后返回main函数的栈帧继续执行;