X64 调用约定
文章目录
孩子记性老不好,多半是废了。最近懒病爆发,实在没有办法,只能让自己多写点东西了(太堕落了,再这么下去真废了)。。。进入正题。
调用约定这个东西吧,好像还真没啥能扯的。比较烦人的一点就是 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
文章作者 Josephine
上次更新 2020-04-08