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值。

posted @ 2015-10-11 14:56  大魔王Faker  阅读(298)  评论(0编辑  收藏  举报