函数调用时函数栈状态分析
2015-07-31 11:55
1136 查看
先贴出自己写的测试代码:
然后来一层一层的分析:
此时函数堆栈的情况大致如下:
此时函数堆栈的情况大致如下:
int* M2(int* p) { return p+1; } int M(int a, char b) { int* pp = M2(&a); return *pp; } int _tmain(int argc, _TCHAR* argv[]) { int e=0; int d = M(3,'c'); getchar(); return 0; }
然后来一层一层的分析:
调用函数Main
008B1030 push ebp // 将ebp的值压入栈 008B1031 mov ebp,esp // 将esp的值赋值给ebp 008B1033 sub esp,8 // esp-8,为了空出变量e,d的空间 int e=0; 008B1036 mov dword ptr [e],0 // 将e的值设置为0 int d = M(3,'c'); 008B103D push 63h // 将'c'压入栈 008B103F push 3 // 将整数3压入栈 008B1041 call M (8B1010h) // 调用函数M
此时函数堆栈的情况大致如下:
调用函数M
int M(int a, char b) { 01391010 push ebp // 将ebp的值压入栈 01391011 mov ebp,esp // 将esp的值赋值给ebp 01391013 push ecx // ecx压入栈 int* pp = M2(&a); 01391014 lea eax,[a] // 将变量a的地址赋给eax 01391017 push eax // 将eax压入栈 01391018 call M2 (1391000h) // 调用函数M2()
此时函数堆栈的情况大致如下:
调用函数M2
int* M2(int* p) { 01391000 push ebp // ebp入栈 01391001 mov ebp,esp // ebp = esp return p+1; 01391003 mov eax,dword ptr [p] // eax = p; 01391006 add eax,4 // eax+=4; } 01391009 pop ebp // 将栈顶的值弹出给ebp 0139100A ret // 返回
01391018 call M2 (1391000h) // 调用函数M2() 0139101D add esp,4 // esp+=4 01391020 mov dword ptr [pp],eax // eax的值赋给pp return *pp; 01391023 mov ecx,dword ptr [pp] // 将pp指向的地址赋值给ecx 01391026 mov eax,dword ptr [ecx] // 将ecs指向的地址赋值为eax } 01391028 mov esp,ebp 0139102A pop ebp 0139102B ret
相关文章推荐
- 解析在main函数之前调用函数以及对设计的作用详解
- javascript 函数调用规则
- 基于C++内存分配、函数调用与返回值的深入分析
- 解析c语言中"函数调用中缺少哨兵"的情况分析
- JavaScript 函数调用规则
- C/C++函数调用的几种方式总结
- Lua教程(五):C/C++操作Lua数组和字符串示例
- C/C++实现快速排序的方法
- C/C++常用函数易错点分析
- Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案
- 把Lua函数传递到C/C++中实例
- js中函数调用的两种常用方法使用介绍
- C/C++中退出线程的四种解决方法
- 浅析C/C++中sort函数的用法
- js函数调用的方式
- Javascript中匿名函数的多种调用方式总结
- Python中实现结构相似的函数调用方法
- 开源操作系统和必备工具网站收集
- Notepad++配置C/C++IDE(详细)
- C 堆栈,运行时类型挷定