在64位机器上参数的传递前6个 从左向右分别保存在rdi,rsi,rdx,rcx,r8和r9中,但是从第七个开始就要从又向左的入栈,如下图
在下面的例子中用嵌入式汇编的方式验证这正传参方式,前6个确实保存在rdi,rsi,rdx,rcx,r8和r9中如下输出结果:
但是64位架构中寄存器还存在很多如下:
那么第七个参数会不会在r10或之后的寄存器中保存呢,通过将第65行注释取消,并将66行67行注释掉,打印出结果如下
很显然r10中并无保存参数,那么怎么获得参数呢,这时候将65行注释,将66 67行注释取消得到结果:
看吧最后一行 我们成功的从堆栈中获得了参数的值,代码如下,可以自己搞一下
53 void fun(long a,long b,long c,long d,long e,long f,long g)
54 {
55 long a1,b1,c1,d1,e1,f1,g1;
56
57 __asm__ __volatile__
58 (
59 "movq %%rdi,%0\n"
60 "movq %%rsi,%1\n"
61 "movq %%rdx,%2\n"
62 "movq %%rcx,%3\n"
63 "movq %%r8,%4\n"
64 "movq %%r9,%5\n"
65 // "movq %%r10,%6\n"
66 "movq 16(%%rbp),%%rax\n"
67 "movq %%rax,%6\n"
68 :"=m"(a1),"=m"(b1),"=m"(c1),"=m"(d1),"=m"(e1),"=m"(f1),"=m"(g1)
69 );
70
71 printf("%ld %ld\n",a,a1);
72 printf("%ld %ld\n",b,b1);
73 printf("%ld %ld\n",c,c1);
74 printf("%ld %ld\n",d,d1);
75 printf("%ld %ld\n",e,e1);
76 printf("%ld %ld\n",f,f1);
77 printf("%ld %ld\n",g,g1);
78 }
79
80 int main(int argc,char *argv[])
81 {
82 fun(2,3,4,5,6,7,8);
83 return 0;
84 }