测试64位机器参数的传递

在64位机器上参数的传递前6个 从左向右分别保存在rdi,rsi,rdx,rcx,r8和r9中,但是从第七个开始就要从又向左的入栈,如下图

在下面的例子中用嵌入式汇编的方式验证这正传参方式,前6个确实保存在rdi,rsi,rdx,rcx,r8和r9中如下输出结果:

但是64位架构中寄存器还存在很多如下:

那么第七个参数会不会在r10或之后的寄存器中保存呢,通过将第65行注释取消,并将66行67行注释掉,打印出结果如下

很显然r10中并无保存参数,那么怎么获得参数呢,这时候将65行注释,将66 67行注释取消得到结果:

看吧最后一行 我们成功的从堆栈中获得了参数的值,代码如下,可以自己搞一下

扫描二维码关注公众号,回复: 2522641 查看本文章
 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 }

猜你喜欢

转载自blog.csdn.net/yldfree/article/details/81226219