#include <stdio.h> void main() { int a = 2; void e(int n); e(a); } void e(int n) { if (n > 0) { e(--n); printf("*%d*/n* ", n); e(n); printf("%d good!/n",n); } } | | main | | |_______________________| | | | pushl a = 2 | |_______________________| | | call e | pushl IP | |_______________________| | | | pushl %ebp | |_______________________| | | a > 0 exec if| pushl a = 1 | |_______________________| | | call e sec | pushl IP | |_______________________| | | | pushl %ebp | |_______________________| | | a > 0 exec if| pushl a = 0 | |_______________________| | | call e third | pushl IP | |_______________________| | | | pushl %ebp | |_______________________| | | a == 0 return| pushl a = 0 | |_______________________| | | | pushl $"*d*/n*" | |_______________________| |show *0* | call printf | * | |______on screen________| | | | pushl a = 0 | |_______________________| | | call e fourth| pushl IP | |_______________________| | | | pushl %ebp | |_______________________| | | a == 0 return| pushl a = 0 | |_______________________| | | call printf | pushl $"%d good/n"| |_______________________| |show | | 0 good* | |_______on screen_______| | | | | | | | | | main | | | | | | | |__________________| / |____________________| / |_______________| |___________________| | | / | | / | | | | | int a = 2 | / | if(2 > 0) | / | if(1 > 0) | | | |__________________|/ |____________________|/ |_______________| |___________________| | | | | | | | | | e(2); | | e(1); | | e(0); |------->| return void | |__________________| |____________________| |_______________| |___________________| | |/ | |/ | | | | | return void | |printf("xxx"); | / |printf("xxx"); | | | |__________________| |____________________| / |_______________| |___________________| | | / | | / | | | | | | | | / | e(0); |------->| return void | |__________________| |____________________| / |_______________| |___________________| | | / | | / | | | | | | | | /|printf("yyy"); | | | |__________________| |____________________| |_______________| |___________________| | | | | | | | | | | / | | | | | | |__________________| |____________________| / |_______________| |___________________| | | | | / | | | | | | | | / | if(1>0) | | | |__________________| / |____________________| / |_______________| |___________________| | | | | / | | | | | | | | / | e(0); |------->| return void | |__________________| |____________________|/ |_______________| |___________________| | | / | | | | | | | | | e(1); | |printf("xxx"); | | | |__________________| |____________________| |_______________| |___________________| | | | |/ | | | | | | |printf("yyy"); | / | e(0); |------->| return void | |__________________| /|____________________| / |_______________| |___________________| | | | | / | | | | | | | | / |printf("yyy"); | | | |__________________| |____________________| / |_______________| |___________________|