我是靠谱客的博主 愤怒音响,最近开发中收集的这篇文章主要介绍Cdecl/stdcall函数调用内存模型(gcc 3.4.5)1.无局部变量2.有N个int型局部变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

 

 

最后

以上就是愤怒音响为你收集整理的Cdecl/stdcall函数调用内存模型(gcc 3.4.5)1.无局部变量2.有N个int型局部变量的全部内容,希望文章能够帮你解决Cdecl/stdcall函数调用内存模型(gcc 3.4.5)1.无局部变量2.有N个int型局部变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部