函数栈帧的创建和销毁

每个编译器的汇编码不一样,以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中。

以上就是函数栈帧的创建和销毁的全部内容了。

欢迎各位提问。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值