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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言编2048,c语言编写的2048游戏代码,大家可以参考一下这些

2048_launcher.c#include #include #include void main(){printf("正在启动中,请稍后!\n");Sleep(1000);system("bin\\Version\\games\\0.1\\0.1.exe");}补充:0.1.c#include#include#include#include#define WIN 256 // …

python numpy中sum()时出现负值

import numpy anumpy.random.randint(1, 4095, (5000,5000)) a.sum() 结果为负值, 这是错误的,a.sum()的类型为 int32,如何做才能是结果显示正确呢?按照如下做法: cnumpy.int64(a).sum() 结果为正直,正确,c…

SQL Server插入中文数据出现乱码问题

问题如上图。 创建数据库的代码---创建promary表 create table promary ( proID int primary key, proName varchar(50) not null ) 出现上图所示内容是因为proName varchar(50) not null这个地方有问题。一般来说,如果含有中文字符,用nchar/nvarchar&…

c语言find和mid函数的使用方法,Excel Mid函数和MidB函数使用方法的7个实例,含与Len和Find组合反向提取字符或截取单位...

在 Excel 中,Mid函数用于从文本中提取从指定位置开始的指定字符数,而MidB函数用于从文本中提取从指定位置开始的指定字节数;它们的区别为:前者把全角(如汉字)与半角(如数字和字母)都算作一个字符,后者把全角算作两个字…

C++类指针类型的成员变量的浅复制与深复制

本篇文章旨在阐述C类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决。需要读者有较好的C基础,熟悉引用,const的相关知识。 引言: 类作为C语言的一种数据类型,是对C语言结构体的一…

21天学通c语言第四版pdf,21天学通Visual C++ PDF扫描版[116MB]

21天学通Visual C 内容简介:本书是Visual C语言的入门教程,较全面地介绍了Visual C编程的相关知识,然而,本书并没有泛讲Visual C语言的所有知识,而是突出重点,选择最重要的内容进行讲解。本书一共分为五篇&…

空间索引不能用analyze进行分析

一天,同事问,为何执行了索引分析后(ANALYZE INDEX index_name COMPUTE STATISTICS;),查看user_indexes视图中的last_analyze字段时间没有变化。自己试了下,发现普通索引是可以的,但是对于空间索…

继续聊WPF——动态数据模板

我为啥称之为“动态数据模板”?先看看下面的截图,今天,我们就是要实现这种功能。 大概是这样的,我们定义的DataTemplate是通过触发器动态应用到 ComboBoxItem 上。 这个下拉列表控件绑定了一个Person集合,Person类的定…

刺激战场c语言,刺激战场:假车库、C字楼都是啥?学会吃鸡术语新手变大神!...

原标题:刺激战场:假车库、C字楼都是啥?学会吃鸡术语新手变大神!刺激战场有越来越多的新玩家加入其中,然而新手想入门,却有时候找不对方法,其实吃鸡这个游戏其实还是非常简单的,不过想…

WPF 创建无边框的圆角窗口

第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为True,即:Background"Transparent" AllowsTransparency"True",将Window的WindowStyle属性设置为None&#xff0c…

c语言关于链表选择题看不懂,有关链表基本操作三题

因为觉得C语言老师讲链表讲的太匆忙了,况且PPT太乱太杂,看不懂因此特地重写了次这周三上机有关链表操作的三题。(所写题目默认已排序,不考虑排序)问题A:在单链表中按学号查成绩时间限制: 1 Sec 内存限制: 128 MB提交: 62 解决: 43[提交][状…

linux下的awk程序执行

#!/bin/awk -f awk脚本开头使用这个命令,赋予这个文本文件以执行的权限。这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程序了。 BEGIN和END的大括号必须紧其后,如果换行会出错: awk: cmd. line:14: war…

HTMLParser-实战

了解了HTMLParser库的知识后,选择做一个小训练,对https://www.python.org/events/python-events/这个网址进行分析,之后输出其中每次会议的题目、时间和地点。 如果要简单了解下HTMLParser库可以点击打开 下面进入正题 这是网站的源码&#x…

c语言会员卡管理系统,路西牌会员管理系统。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼void VIP::show( Node *v){no(v);char *aVIP::sex(v);std::cout<<< "会员姓名: "<< node.item.num[1]<< endl<< "性别: "<< sex(v)<<< "手机号码: "<…

Data URI scheme 在 html 中嵌入小图片

例如: <img src"https://img-blog.csdnimg.cn/2022010704064257868.png" /> 这会显示一张图片,网上的资料一般说是 ie8 才支持,不过我在老早前就见过了,应该和 ie8 没什么关系. 刚刚又用 ie6 试了一下,的确是可以的.这是以讹传讹啊. 另外据说这只支持 32K 大小…

常见的不同类型运算的转换方式

1.字符串和数字相加&#xff0c;数字转成字符串. var one"This is a test"; var two123; var threeonetwo;// 结果&#xff1a;three:This is a test123 2.数字和布尔值相加&#xff0c;布尔值 false 转成 0&#xff0c;true 转成 1 var one13; var twotrue; var thr…

c++2015语言,2015年7月TIOBE编程语言排行榜:C++ 的复兴

2015年7月TIOBE编程语言排行榜&#xff1a;C 的复兴C是2015年上半年同比增长最快的编程语言。具体为C 增长3.1%&#xff0c;Java 增长2.0%&#xff0c;C#增长1.6%&#xff0c;Python增长1.6%。C大幅度增长的原因可能是引入了新的C11标准。这使得C被大范围的接受。C 11标准为C带…

js面向对象开发互联网机顶盒应用头端之二

/*** Dare Movie Object.* constructor*/ //声明构造函数 构造函数初始化变量Dare.Movie function() { this.parent new Dare.Util(); this.className "Dare.Movie"; //----类Dare.Movie全局属性变量-----// this.stylePath dareStyle.getStylePath(); this.…

nginx内置变量 大全

nginx内置变量 内置变量存放在 ngx_http_core_module 模块中&#xff0c;变量的命名方式和apache 服务器变量是一致的。总而言之&#xff0c;这些变量代表着客户端请求头的内容&#xff0c;例如$http_user_agent, $http_cookie, 等等。 下面是nginx支持的所有内置变量&#xf…

android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解

主要思想&#xff1a;将一个view设计成多层&#xff1a;背景层&#xff0c;含中奖信息等&#xff1b;遮盖层&#xff0c;用于刮奖&#xff0c;使用关联一个Bitmap的Canvas在该Bitmap上&#xff0c;使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作)使用paint.setXf…