DEV Community

Tim Jan
Tim Jan

Posted on Edited on

Windows x64 Calling Convention

calling conventions定义

  1. 参数如何被传入
  2. 谁给变量分配空间
  3. 谁清除栈 Callee refers to the function being called, and the caller is the function making the call. ## fastcall Application Binary Interface(ABI):定义calling convention,parameter handling规则 具体的x64windows调用约定:
  4. 从左到右的前四个参数被传入registry:为非浮点时:RCX,RDX,R8,R9;浮点时:XMM0, XMM1, XMM2, and XMM3 2.如果上面的是是浮点和整型的混合,则填入对应位子的registry即如果第二个为整型则第二个寄存器为RDX 3.如果参数太大则传入reference(即内存地址指针) 4.参数可以放入任何对应(整型或浮点型)的可以放下的寄存器 5.如果无法放入寄存器,则传入栈(超过四个参数) 注意:无论是否使用到栈,栈中都会预留四个参数的空间 课外的调用约定:
  5. Member functions have an implicit first parameter for the "this" pointer. Because it's a pointer and it's the first parameter, it will be passed via RCX. This can be very useful to know.
  6. RBP在调用方法时要保存(push),调用后要恢复pop
  7. 方法的返回值通过RAX(integer, bool, char, etc., )或XMM0(浮点)传递
  8. 调用函数需要为被调用函数参数预留参数空间,即使没有参数,也至少要预留4个参数空间
  9. 易失寄存器(volatile RAX, RCX, RDX, R8, R9, R10, R11, and XMM0-XMM5 ):函数调用时,被调函数可以随意覆盖、修改这些寄存器 和 非易失寄存器(nonvolatile RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15, and XMM6-XMM15):在调用前入栈保存,调用后恢复

Stack Access

请记住:前四个参数尽管通过寄存器传递,但栈上依然会为它们预留空间。这块空间大小为 32 字节(0x20),4 个寄存器各自占用 8 字节。
如果超过四个参数入栈,RSP+0x20 处存放第五个参数,RSP+0x28 处存放第六个参数。

Top comments (1)

Collapse
 
call_me_sin profile image
Tim Jan

了解调用约定,如fastcall等