函数调用时函数栈状态分析
来源:互联网 发布:网络里马鹿是什么意思 编辑:程序博客网 时间:2024/05/16 09:16
原文:http://www.cnblogs.com/quark/archive/2012/03/20/2407487.html
先贴出自己写的测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
10
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
// 返回
1
2
3
4
5
6
7
8
9
10
11
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
0 0
- 函数调用时函数栈状态分析
- 函数调用时函数栈状态分析
- 函数调用过程中的寄存器状态分析
- 函数调用时的栈状态
- 函数调用栈分析
- 函数调用栈分析
- 函数调用栈分析
- 函数调用栈帧分析
- 函数调用堆栈分析
- 函数调用分析
- 函数调用分析
- 函数调用堆栈分析
- 函数调用堆栈分析
- 函数调用堆栈分析
- 函数调用全过程分析
- 函数调用时栈帧分析
- 函数调用分析
- 函数调用过程分析
- SOAP webserivce 和 RESTful webservice 的那些事
- MDK4选项说明
- hdu1005
- C++使用STL:慎重选择删除元素的方法
- android开发之蓝牙低能量
- 函数调用时函数栈状态分析
- gcc 怎样指定include路径
- Stomp协议学习与实战
- 简单的请求处理
- STM32固件库V3.5.0的CMSIS文件解析
- Java类加载器
- 多IDC的数据分布设计
- A compact algorithm for rectification of stereo pairs翻译,中文版
- 杭电1251——统计难题(字典树的应用)