Cdecl/stdcall函数调用内存模型(gcc 3.4.5)

Cdecl/stdcall在不同的编译器下实现有会所有不同,本人是在gcc 3.4.5下测试的。

 

1.无局部变量

a.刚进入函数时:

 

 

 

b.然后在函数体一开始执行了以下代码之后:

 

push  ebp

mov   ebp,esp

sub   esp,0x8

......

 

c.函数末尾执行:

 

leave

ret

Leave其实就是使ESP+0xc,更通用一些就是EBP+0x4,ESP指向Ret EIP,然后返回,最后由函数的调用者清理堆栈,如果是stdcall的话,则在函数内执行清理堆栈操作,再执行返回操作。

 

2.有Nint型局部变量

 

a.刚进入函数时:

 

 

 

 

b.然后在函数体一开始执行了以下代码之后:

 

push  ebp

mov   ebp,esp

sub   esp,( MIN(X)*0x10+0x8 );满足:MIN(X)*0x10>=N*0x4

......

 

也就是说,跟据局部变量的多少,临时空间的开辟是以0x10为增长量,也许是为了内存对齐吧,而且不同的编译器实现也不一样.比如有5int型临时变量则sub esp,0x28;8int型临时变量也是sub esp,0x28;到有9int型临时变量则为sub esp,0x38

 

 

   

 

 

c.在函数末尾执行:

 

leave

ret

Leave其实就是使ESP+( MIN(X)*0x10+0x8 )+0x4,更通用一些就是EBP+0x4,ESP指向Ret EIP,然后返回,最后由函数的调用者清理堆栈,如果是stdcall,则在函数体内作堆栈清理,再执行返回操作。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值