Calling Conventions (x86 arch)

摘要

Calling conventions就是描述被调用代码的接口规则:

  1. 函数参数的分配顺序
  2. 参数如何传递(栈, 寄存器, 或两者混合)
  3. 寄存器的值由谁来维护(调用者或被调用者)
  4. 栈的准备和恢复分别由谁完成(调用者或被调用者)

调用者和被调用者

A函数调用(call)B函数, A是调用者, B是被调用者

调用者希望寄存器的值被保护, 这样在函数调用之间, 就不必费精力去保存/恢复寄存器的值. 而被调用者不希望寄存器的值被保护, 这样在函数进入时就不必保存寄存器的值, 函数退出的时候也不用恢复寄存器的值. 因此Calling Conventions的选择就是要平衡这个关系.

Calling Conventions

All
在32位x86下, EDI,ESI, EBP, EBX寄存器都是被保护的, EDX:EAX被用来存返回值

C (__cdecl)
参数由右向左入栈, 调用者清理参数, 函数名前加下划线修饰

__stdcall
WIN32编程中使用. 变参函数依然使用__cdecl. 参数由右向左入栈, 被调用者清理栈. 函数名修饰规则: _{function_name}@{bytes_of_parameters_taken}

__fastcall
前两个参数由ECX和EDX传递, 余下的从右向左由栈来传递. 被调用者清理栈. 函数名修饰规则: @{function_name}@{bytes_of_parameters_taken}

thiscall
第一个参数(就是this参数)由ECX传递, 余下的按照__stdcall来走. 被调用者清理栈. 函数名修饰规则由一个复杂的规则实现(为了实现C++的函数重载)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值