设为首页 加入收藏

TOP

C函数调用原理(二)
2015-11-19 23:06:47 来源: 作者: 【 】 浏览:6
Tags:函数 调用 原理
|__ret__|<-esp |__ebp__| |_______| |_______| |_______| |_______| |_______| 5.3 返回调主 ret |_______| ebp->|_______| |_______| |_______| |_______| |__p2___| |__p1___| |__p0___|<-esp |__ret__| |__ebp__| |_______| |_______| |_______| 上面说要调整esp,把参数移出掉。gcc没有做这一步。esp就保留在这里 当下面再次调用函数时,旧值就被覆盖掉。参看第一步! 5.1和5.2步,可以使用leave指令代替 */ //验证 #include #include void fun(int a, int b) { int local; unsigned int i, j; long ret; local = 12; a = 10; // printf("%d\n", a); #if 1 asm volatile ( "movl %%ebp, %%eax\n\t" "movl %%esp, %%ebx\n\t" :"=a"(i), "=b"(j) :); printf("ebp = %p; esp = %p\n", i, j); printf("local auto var : %d\n", i - j); //局部变量占用空间 asm volatile ( "movl 12(%%ebp), %%eax\n\t"//参数b "movl 8(%%ebp), %%ebx\n\t" //参数a "movl 4(%%ebp), %%ecx\n\t" //ret :"=a"(i), "=b"(j), "=c"(ret) :); printf("p2 = %x; p1 = %x; ret = %p\n", i, j, ret); #endif } int main(int argc, char *argv[]) { fun(1, 2); exit(0); }

总结

1-如果自行编写汇编,那么就要自行处理这些工作,以及对某些寄存器的压栈出栈的保护措施

2-第5.2步,当ebp弹出后,一个栈帧就不存在了,即函数环境已经撤销,因此如果fun内return一个局部变量的引用,也就无意义了。这是最常见的问题!!!

3-局部变量空间的分配,换言之,第4步,对esp的调整,其大小要根据编译时符号表而定!

?

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言的通用链表 下一篇程序中对密码进行加解密的C代码示..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: