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… Read More