rep+stos+dword+ptr+[edi]
00401028 push edi
00401027 push esi
00401026 push ebx
00401029 lea edi,[ebp-40h] Edi Esp
00401023 sub esp,40h 40h的空间
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
进入func后00401020 push ebp Esp Ebp
隐含把call的下一条指令入栈
0040107A push 1
00401078 push 2
00401068 push edi由于00401069 lea edi,[ebp-40h]看下面
00401067 push esi
00401066 push ebx
00401063 sub esp,40h (Edi) Esp
00401063 sub esp,40h 40h字节的数据空间
0040106C mov ecx,10h 00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi] ;
00401060 push ebp 00401061 mov ebp,esp Esp Ebp
转】C函数调用与堆栈
这几天突然很想弄明白c函数调用时栈的使用情况,上网查了一下资料,自已也研究了一下,这篇blog就把我的所得记录下来吧。
这篇blog试图讲明当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。这些细节跟操作系统平台及编译器的实现有关,下面的描述是针对运行在Intel奔腾芯片上Linux的gcc编译器而言。c语言的标准并没有描述实现的方式,所以,不同的编译器,处理器,操作系统都可能有自己的建立栈帧的方式。
一个典型的栈帧
ESP==>| : |
| . |
+-------------------------+
| 被调用者保存的寄存器现场 |
| EBX,ESI和EDI(根据需要)|
+-------------------------+
| 临时空间 |
+-------------------------+
| 局部变量#2 | [EBP - 8]
+-------------------------+
| 局部变量#1 | [EBP - 4]
+-------------------------+
EBP==>| 调用者的EBP |
+-------------------------+
| 返回地址 |
+-------------------------+
| 实际参数#1 | [EBP + 8]
+-------------------------+
| 实际参数#2 | [EBP + 12]
+-------------------------+
| 实际参数#3 | [EBP + 16]
+-------------------------+
| 调用者保存的寄存器现场 |
&nb
补充:软件开发 , 其他 ,