yehao's Blog

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,则在函数体内作堆栈清理,再执行返回操作。

http://blog.csdn.net/ggggfjeicfh/article/details/5003398

posted on 2012-02-29 17:18 厚积薄发 阅读(806) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论