Win32-API函数调用的约定

函数调用原理:
win32 api的函数调用方式是stdcall,其过程操作如下:


调用函数的代码:

1.调用函数的逻辑代码
2.函数调用代码 
  a.将参数存入栈 (从右向左入栈)
  b.跳转  call 入口地址
    push eip (压入返回地址,即函数调用返回后要执行的下一条指令的地址) 
    mv eip 函数的地址 (将eip设置为被调用函数的地址,执行其代码区指令) 

3.调用函数的逻辑代码


被调用函数的代码:
1.压入函数栈帧
    push ebp(压入旧栈帧的底部)
    mov ebp,esp(设置新栈帧的底部)
    sub esp,xxx(设置新栈帧的顶部)
2.被调用函数的逻辑(如果有返回值的话,存入寄存器)
3.弹出函数栈帧
    add esp,xxx(回收当前栈帧,栈顶指向旧栈帧底部值)
    pop ebp(将旧栈帧底部值位置恢复到ebp)
4.返回 ret
    将eip设置为返回地址(返回到原函数)


由调用函数和被调函数的模拟步骤可以看出:
(addr:005)call ~ (压入栈中的值是:006,把~的地址放入eip)
(addr:006)do sth
上下两指令之间,时间和步骤上是分水岭,距离上可能很远。
(addr:078)push ebp



回忆组成原理知识,一条机器指令的执行过程:取指,译码,执行,写回。每一条机器指令的运行,都会涉及到EIP的变化(这是机器级别的,其操作对汇编级别也不可见)。

call ~ 指令完成的微操作:
1,将当前eip的值(也就是当前指令的地址+1,也就是call~这条指令的所在地+1)放入栈中。
2,把eip从当前值改为被调用函数的首地址。


ret 指令完成的微操作:
1,从栈中取出值,送入eip。


jmp ~ 指令完成的微操作:
1,把eip的值改为~。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值