MS VC的参数传递方式为:

前4个参数总是放在寄存器中传递,剩余的参数则压入堆栈中。而x86上则是全部压入堆栈中(除了fastcall方式)。

这4个用于存放参数的寄存器分别是:
存放整数参数的RCX,RDX,R8,R9;
存放浮点数参数的XMM0,XMM1,XMM2,XMM3;

整数和浮点数参数混合出现:
func3(float a, int b, double c, int d)
a放入XMM0中,b放入RDX,c放入XMM2,d放入R9。
这里比较特殊,其实就是按照这个规则:
a b c d
XMM0 RDX  XMM2 R9
也就是说4个整数寄存器严格的一一对应前4个参数,同样前4个XMM寄存器严格的一一应前4个参数,如果是整数浮点数间隔出现,那么就保持对应关系,选择对应的寄存器即可。

而gcc的则不是这样
版权为 win_hate 所有, 转载请保留作者名字
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为 7 个以上时, 前 6 个与前面一样, 但后面的依次从 "右向左" 放入栈中

例如:
CODE
(1) 参数个数少于7个:
f (a, b, c, d, e, f);
a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%r8, f->%r9

g (a, b)
a->%rdi, b->%rsi

有趣的是, 实际上将参数放入寄存器的语句是从右到左处理参数表的, 这点与32位的时候一致.

CODE
2) 参数个数大于 6 个的时候
H(a, b, c, d, e, f, g);
a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%rax
g->8(%esp)
f->(%esp)
call H

转载请注明转自: 听风 , 本文固定链接: X64 下的参数传递