win32平台下的函数调用

当一个PE文件被加载进内存中后,就变成了进程。进程将内存分为代码区、数据区、堆区和栈区。

一、栈

栈是指系统栈,可以动态地存储函数之间的调用关系,栈通过两个寄存器和栈的平衡操作来维护。

1.ESP:栈指针寄存器,相当于栈顶。

2.EBP:基址指针寄存器,是栈帧的栈底。

栈帧是为每个函数单独服务的一段栈空间。

二、函数调用

1.参数入栈:V C++参数由右向左依次进栈

2.返回地址入栈:返回地址是指代码区调用函数的下一条指令的地址

3.代码区跳转:处理器从当前代码区跳转到被调用函数的入口处

4.栈帧的变化:保存当前栈帧情况,以备后面恢复(EBP入栈);切换到新栈帧(EBP变为ESP的值);给新栈帧分配空间(ESP减去空间大小,抬高栈顶)

push 参数

call 函数地址//保存返回地址;跳转到调用函数的入口地址

push ebp

mov ebp, esp

sub esp, xxx

三、函数返回

1.保存返回值:通常返回值保存在EAX里

2.弹出当前栈帧,恢复上一个栈帧

add esp, xxx

pop ebp

ret//弹出栈顶元素也即返回地址;让处理器跳转到弹出的返回地址,将返回地址弹给EIP寄存器

 

注意:ESP EBP EIP EAX的作用;call ret的意义;

一般将前栈帧的EBP值作为两个栈帧的分界线

即调用函数的栈帧包括:其他空间+被调用函数的参数+返回地址+此函数的EBP值。

转载于:https://www.cnblogs.com/xiaofool/p/4869271.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值