每次函数调用,都为函数开辟一块空间,成为栈帧。
首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),我们称为栈底指针,寄存器esp指向当前的栈帧的顶部(低地址),我们称为栈顶指针。
注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。
给段代码,剖析下面函数运行过程。
运行环境:VC6.0,(相比VS,更容易查看内存)
#include<stdio.h>
int Sub(int x,int y)
{
int t=0;
t=x-y;
return t;
}
int main()
{
int a=10;
int b=20;
int c=0;
c=Sub(a,b);
return 0;
}
给出这段代码的汇编代码
8: int main()
9: {
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,4Ch
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 lea edi,[ebp-4Ch]
0040106C mov ecx,13h
00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi]
10: int a=10;
00401078 mov dword ptr [ebp-4],0Ah
11: int b=20;
0040107F mov dword ptr [ebp-8],14h
12: int c=0;
00401086 mov