c语言通过什么传递参数 寄存器,关于使用寄存器传参解决方法

关于使用寄存器传参

在使用64位系统编程时,发现一个问题,麻烦大家帮忙看看,谢谢啦!!!

C语言代码如下:

void swap(int *a, int *b)

{

int c;

c = *a;

*a = *b;

*b = c;

}

对应的汇编代码:

Dump of assembler code for function swap:

0x00000000004004ed :push   %rbp

0x00000000004004ee :mov    %rsp,%rbp

0x00000000004004f1 :mov    %rdi,-0x18(%rbp)  ; 参数由rdi和rsi寄存器传入,是两个地址

0x00000000004004f5 :mov    %rsi,-0x20(%rbp)   ;  不明白它为什么要先保存,而不直接使用寄存器

=> 0x00000000004004f9 :mov    -0x18(%rbp),%rax

0x00000000004004fd :mov    (%rax),%eax

0x00000000004004ff :mov    %eax,-0x4(%rbp)

0x0000000000400502 :mov    -0x20(%rbp),%rax

0x0000000000400506 :mov    (%rax),%edx

0x0000000000400508 :mov    -0x18(%rbp),%rax

0x000000000040050c :mov    %edx,(%rax)

0x000000000040050e :mov    -0x20(%rbp),%rax

0x0000000000400512 :mov    -0x4(%rbp),%edx

0x0000000000400515 :mov    %edx,(%rax)

0x0000000000400517 :pop    %rbp

0x0000000000400518 :retq

End of assembler dump.

参数既然都是通过寄存器传入了,而且在后面的汇编代码中也可以看到,rsi和rdi的值并没有改变,那为什么还要对传入的参数做保存呢?这有什么特殊的含义么?

------解决方案--------------------

你这个是debug版本的编译结果,不会进行优化。是一行行直译的结果,所以显得比较傻。

换成release编译,没用的操作就会被优化掉了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值