每个编译器的汇编码不一样,以vs2013为例。
1、寄存器
eax、ebx、ecx、edx、esp、ebp等。
在vs2013中main函数也是被其他函数调用的
mainCRTSTStartup调用__tmainCRTStartup函数
__tmainCRTStartup调用main函数
在调用main函数和 __tmainCRTStartup函数时,编译器会创建这两个函数的栈帧。
以创建main函数的栈帧为例:
push:在栈空间中增加一个元素称之为压栈,esp自动向上移动一个指针的长度
mov:元素一,元素二。将元素二的值赋给元素一
sub:元素一,元素二。元素一减元素二
lea:全称为 load effective address 元素,地址。将地址加载的元素中
rep stos:每次出ecx次,每次出4个字节,内容为eax
由图可知:
在调用函数之前,先传参。而且是由右到左依次将参数压栈。
Add函数的栈帧的创建和main函数栈帧的创建同理。
需要注意的是:
ptr[x],ptr[y]是main函数参数b压栈和参数a压栈的地址,所以说形参是实参的临时拷贝。
将函数返回的值存入eax寄存器中,最后没有pop弹出,所以就不会丢失数据。
pop:指的是出栈(在栈空间中弹出一个元素与push相反),esp向下移动
ege:pop edi 指的是弹出edi,放到edi中。
以上就是函数栈帧的创建和销毁的全部内容了。
欢迎各位提问。