首先,要知道栈是什么?
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。允许插入和删除的一端称为栈顶(esp),另一端则为栈底(ebp),所以栈又被称为后进先出的线性表(LIFO);
在内存中空间的分配是高地址向低地址递增的。
那么,栈帧又是什么?
那么来看一个例子!
int sum(int a,int b)
{
/*push ebp 让main栈底地址入栈
mov ebp,esp 让栈顶和栈底指针同时指向main栈底地址
sub esp,4ch 开辟空间
ebp<=>esp 0xcccccccc 初始化0xcccccccc
*/
int tmp = 0;//mov dword ptr[ebp-4],0
tmp = a+b;//mov eax dword ptr[ebp+8] add eax dword ptr[ebp+0ch] 取形参a 加等 形参b 存入寄存器eax中
//mov dword ptr[ebp-4],eax 将寄存器eax赋给tmp
return tmp;//mov eax,dword ptr[ebp-4] // 将tmp放到eax寄存器中返回
/*mov esp,ebp 使esp,ebp指向main栈底地址
pop ebp 出栈,赋给ebp
ret 把出栈的内容给PC寄存器
*/
}
int main()
{
/*
push ebp
mov ebp,esp
sub esp,4ch
ebp<=> 0xcccccccc
*/
int a = 10;//mov dword ptr[ebp-4],0Ah
int b = 20;//mov dword ptr[ebp-8],14h
int ret = sum(a,b);
/*
mov eax,dword ptr[ebp-8]
push eax 形参b压栈
mov ecx,dword ptr[ebp-4]
push ecx 形参a压栈
call sum 入栈(入其下一行指令的地址),进入sum函数
add esp,8 释放形参内存
mov dword ptr[ebp-0ch],eax
*/
}