孩子记性老不好,多半是废了。最近懒病爆发,实在没有办法,只能让自己多写点东西了(太堕落了,再这么下去真废了)。。。进入正题。

调用约定这个东西吧,好像还真没啥能扯的。比较烦人的一点就是 Win(MSVC) 和 Linux(GCC) 有些不一样。

参数传递

Win

前四个整数变量通过寄存器传递,分别是 RCX、RDX、R8、R9,按照从左到右的顺序,剩下的保存在栈中,按照从右到左的顺序;前四个浮点和双精度参数传入 XMM0 - XMM3。

Linux

首先和 MSVC 不同的是通过寄存器传递的参数的格式为6个,即前6个整形参数,分别保存在寄存器 RDI、RSI、RDX、RCX、R8、R9,按照从左到右的顺序,之后的保存在栈中,按照从右到左的顺序;使用 XMM0 - XMM7 放置浮点和双精度参数。

调用者保存的寄存器

这些寄存器被视为易失性的,即子函数以随意使用,可以认为是由调用者保存的。

Win

RAX、RCX、RDX、R8、R9、R10、R11

Linux

RAX、RDI、RSI、RDX、RCX、R8、R9、R10、R11

被调用者保存的寄存器

这些寄存器被视为非易失的,子函数需要在使用前先保存,返回前需要先恢复。

Win

RBX、RBP、RDI、RSI、R12、R13、R14、R15

Linux

RBX、RBP、R12、R13、R14、R15