关于使用寄存器传参

在使用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编译,没用的操作就会被优化掉了。

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

  1. c语言宏不能传递参数,关于c ++:可变参数宏:不能通过’…’传递非平凡复制类型的对象...

    我正在尝试为日志记录机制编写宏. 我编写了一个可变参数宏,但它不适用于std::string. 该代码如下所示: #include #include #define LOG_NOTE(m, ...) ...

  2. python 函数的调用的时候参数的传递_python定义函数时的参数调用函数时的传参...

    一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...

  3. Vue Router不要再使用params传参了,params获取不到参数,官方删除params传参

    问题描述 之前说过,vue路由传参有两种方式,分别是query和params:query是明文,params是隐藏的: 今天在使用params的时候发现获取不到参数了 我的写法: 1. 路由配置: { ...

  4. webservice studio 参数是DataSet时不支持中文 解决方法

    现象: 用webservice studio调试web service时,点DataSet型参数右边的...,在弹出的框(A)中,点击LoadXML,选中填写了数据的XML文件,将数据导入.如果该XM ...

  5. win11语言输入没反应怎么办 windows11语音输入没反应的解决方法

    有用户在使用Win11电脑时发现语音输入没有反应,这是怎么回事?Win11系统才推出不久,很多操作还不是很熟悉,遇到该问题我们要如何解决呢?下面就一起来看看解决方法.更多windows11系统教程,可 ...

  6. win10怎么不能运行c语言,Win10系统打开游戏出现程序无法正常启动0xc0000142解决方法...

    系统是Win10,在打开游戏的时候会弹出系统提示:"程序无法正常启动0xc0000142"的问题,不知道该怎么解决这个问题,其实这可能是系统区域设置的问题.下面装机之家分享一下Wi ...

  7. c语言编译配置文件出错,Android4.4/CM11编译常见错误及解决方法!

    Android4.4/CM11编译常见错误及解决方法! 前言:关于Android4.4/CM11编译中遇到的一些错误,本人进行了整理.有需要的童鞋可以做个参考,如果有什么建议也欢迎指出! 问题1: 编 ...

  8. 静态html页面传递参数,javascript静态页面传值的三种方法分享

    一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm function Post() { //单个值 Read.htm?username=b ...

  9. Postman:传递的参数是List类型时 传参格式的写法

    Postman传递的参数是List类型 实体类中引用了一个List,泛型为其他实体类 参数是List集合时,Postman中参数格式如下图所示: 有不明白的地方,欢迎留言  东小店邀请码:w56mho

最新文章

  1. linux下OpenSSL的RSA密钥生成
  2. 互联网1分钟 |1217
  3. simulink中mpc模块怎么使用_Controllogix系统中ILX34MBS485模块使用
  4. CCF 201712-3 Crontab
  5. 系统架构设计师 - 软件架构设计 - 基于架构开发方法 ABSD (Architecture-Based Soft Design)
  6. 1 利用Anaconda完美解决Python 2与python 3的共存问题
  7. 软件架构设计——软件架构风格
  8. Fluentd日志采集使用教程
  9. cisco ASA ios升级或恢复
  10. IFS系统功能清单之三——IFS成本核算
  11. python修改文件格式为jpg_利用python将webp文件转化为jpg文件,将png文件修改为jpg,图像重命名...
  12. 在计算机英语中 update是什么意思,电脑出现windows update是什么意思?
  13. java 过滤http请求头_JAVAWEB开发实现对请求头、请求参数的过滤
  14. 用计算机弹咱们结婚吧乐谱,儿歌计算器曲谱_计算器弹音乐 大家给点流行歌乐谱吧,谢谢大家...
  15. Firebug的简介
  16. NFT社交时代,从朋克头像到声音名片
  17. python用1000张照片合成一张_有没有什么惊艳的微信头像?Python一键下载1000张!...
  18. 淘集集打单软件那个好?那个打单软件能批量打单?
  19. 【翻译】开源促进会没有赢得 Neo4j 诉 PureThink 案的胜利
  20. CSS让文字超过部分省略号显示

热门文章

  1. Hibernate的generator属性
  2. 正则表达式(不断更新,欢迎纠错)
  3. 避免一个用户多次登录修改版
  4. C++类静态成员与类静态成员函数
  5. 网络编程之 TCP / UDP 及其流程比较
  6. R-CNN detection 运行问题及办法
  7. matlab调用mstg,实验五 双线性变换法设计IIR数字滤波器
  8. ps流 转发_RTP协议全解析(H264码流和PS流)(转)
  9. pythonnet下载_Python for .NET
  10. 为什么需要做归一化或者标准化