测试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行注释取消得到结果:

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

 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 }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值