calling conventions定义
- 参数如何被传入
- 谁给变量分配空间
- 谁清除栈 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调用约定:
- 从左到右的前四个参数被传入registry:为非浮点时:RCX,RDX,R8,R9;浮点时:XMM0, XMM1, XMM2, and XMM3 2.如果上面的是是浮点和整型的混合,则填入对应位子的registry即如果第二个为整型则第二个寄存器为RDX 3.如果参数太大则传入reference(即内存地址指针) 4.参数可以放入任何对应(整型或浮点型)的可以放下的寄存器 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.
- RBP在调用方法时要保存(push),调用后要恢复pop
- 方法的返回值通过RAX(integer, bool, char, etc., )或XMM0(浮点)传递
- 调用函数需要为被调用函数参数预留参数空间,即使没有参数,也至少要预留4个参数空间
- 易失寄存器(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)
了解调用约定,如fastcall等