c++没有返回值的返回值

在这里插入图片描述

上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度

int search(int n)
{
00007FF66DB723E0  mov         dword ptr [rsp+8],ecx  
00007FF66DB723E4  sub         rsp,18h  int x = 6;
00007FF66DB723E8  mov         dword ptr [x],6  int a = 0;
00007FF66DB723F0  mov         dword ptr [rsp],0  a = x;
00007FF66DB723F7  mov         eax,dword ptr [x]  
00007FF66DB723FB  mov         dword ptr [rsp],eax  if (a == 1)
00007FF66DB723FE  cmp         dword ptr [rsp],1  
00007FF66DB72402  jne         search+26h (07FF66DB72406h)  return 0;	
00007FF66DB72404  xor         eax,eax  
}
00007FF66DB72406  add         rsp,18h  
00007FF66DB7240A  ret  
--- 无源文件 -----------------------------------------------------------------------
00007FF66DB7240B  int         3  
00007FF66DB7240C  int         3  
00007FF66DB7240D  int         3  
00007FF66DB7240E  int         3  
00007FF66DB7240F  int         3  
--- D:\code\test\源.cpp ---------------------------------------------------------int main()
{	
00007FF66DB72410  sub         rsp,38h  int ret = search(0);
00007FF66DB72414  xor         ecx,ecx  
00007FF66DB72416  call        search (07FF66DB723E0h)  
00007FF66DB7241B  mov         dword ptr [ret],eax  

上面是它的反汇编代码,我们可以看到

	a = x;
00007FF66DB723F7  mov         eax,dword ptr [x]  
00007FF66DB723FB  mov         dword ptr [rsp],eax    

在a=x;这句话,它把x放到寄出去eax,然后再把寄出去eax放到a.
这本没有问题,
但是

	int ret = search(0);
00007FF66DB72414  xor         ecx,ecx  
00007FF66DB72416  call        search (07FF66DB723E0h)  
00007FF66DB7241B  mov         dword ptr [ret],eax  

上面代码的意思是先调用search函数,然后把eax寄存器的值赋予ret.在汇编中,它会约定好返回值存在eax寄存器
但是如果你没有返回值对eax寄存器的值进行更新,那么他就会得到之前存在eax寄存器的值

总结:汇编总是认为你有返回值存在某个寄存器上,这些寄存器并不是返回值独享的,可能被之前操作使用,有可能没被用过,但是无论如此,寄存器从二进制的角度来看总是有值的

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

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

相关文章

简易版扫雷+代码分析

前言: 实验一个简易版的扫雷,也要两百来行的代码,因此为了代码整洁,维护起来方便,这里我们和前期实现的三子棋一样,也弄一个游戏的头文件game.h用来装各种头文件以及函数的声明以及宏定义、预处理信息&…

视频文件+EasyDarwin做摄像机模拟器模拟RTSP流很方便,还能做成系统服务,方法与流程

之前我看到过一家人工智能做算法的企业,用EasyDarwinFFMPEG做了一个摄像机的模拟器,方法大概是: 用ffmpeg读取mp4等类型的视频文件(当然ffmpeg啥都能读取),再以RTSP协议的形式推送给EasyDarwin&#xff1b…

为IP地址申请SSL证书

SSL(Secure Sockets Layer)是一种网络协议,用于在浏览器与服务器之间建立安全、加密的连接。SSL证书是用于证明您的网站身份并启用HTTPS(超文本传输安全协议)的安全文件。这种协议可以确保用户与您的网站之间的所有通信…

统计学中两组数据如何进行差异性(相关性)分析?

变量说明: 在确定分析方法前,我们需要了解手中的数据类型,这是最基础也是有必要的,在所有的数据类型中,我们将数据类型分为分类变量也为定类变量和连续变量也称为定量变量,那么什么是定类变量?…

C语言--每日选择题--Day25

第一题 1. 对于C/C语言的函数,下列叙述中正确的是( ) A:函数的定义不能嵌套,但函数调用可以嵌套 B:函数的定义可以嵌套,但函数调用不能嵌套 C:函数的定义和调用都不能嵌套 D&#xf…

修改网卡PHY的灯-RK3568

文章目录 前言1.定制PHY的灯2.通过命令修改LED状态3.修改驱动效果前言 前面我们已经移植了网卡到开发板上面,也能够正常的进行通信,但是,我们会发现座子上面的灯并没有全部亮起来,而且这些灯的含义是什么,并没有讲解到,这里,就此问题,展开学习。 PHY 有一个重要的功能…

凝聚数字经济发展新力量,四象科技受邀出席2023全球数商大会

11月25日,2023全球数商大会在上海开幕。本届大会以“数联全球、商通未来”为主题,上海市委副书记、市长龚正出席大会并宣布大会开幕,国家发展改革委党组成员,国家数据局党组书记、局长刘烈宏,上海市副市长陈杰致辞。四…

奇异值分解SVD(Singular Value Decomposition)

一种理解方式,值得学习(分解时空矩阵) 先在这里阐述一下SVD的用途吧,具体细节稍后再做补充 1.通过SVD对数据的处理,我们可以使用小得多的数据集来表示原始数据集,这样做实际上是去除了噪声和冗余信息&…

为什么要选择数字人SaaS系统源码独立部署呢?

数字人SaaS(Software as a Service)系统是一种基于云计算模式提供的数字人服务,通过独立部署系统源码,企业可以获得更多的灵活性和控制权。 一、数字人SaaS系统源码独立部署的优势 1.定制化和个性化:通过独立部署数字…

【Mysql】【DB】【sql】提高数据库搜索性能的经验

【背景】 项目需要,经常给金融机构做数字化项目,涉及到各类复杂的查询,今天就我认为最重要的影响性能的数据库查询经验以及解决方案做一个分享。 【常见查询设计中最影响性能的方面】 最影响性能的是联表,且联表方面&#xff0…

SA与NSA网络架构的区别

SA与NSA网络架构的区别 1. 三大运营商网络制式:2. 5G组网方式及业务特性3. NSA-3系列4. NSA—4系列5. NSA-7系列6. 5G SA网络架构7. 运营商策略 1. 三大运营商网络制式: 联通:3G(WCDMA)\4G(FDD-LTE/TD-LTE)\5G(SA/NSA)移动:2G(GS…

【备忘录】快速回忆ElasticSearch的CRUD

导引——第一条ElasticSearch语句 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": "ik_smart" }概念 语法规则 HTTP_METHOD /index/_action/IDHTTP_METHOD 是 HTTP 请求的方法,常见的包括…

Rocket mq namesrv源码分析

NameServer 作为注册中心,提供路由注册、路由踢出、路由发现功能,舍弃强一致,保证高可用,集群中各个节点不会实时通讯,其中一个节点下线之后,会提供另外一个节点保证路由功能。 启动入口 org.apache.rock…

【带头学C++】----- 八、C++面向对象编程 ---- 8.5 struct结构体类型增强使用说明

目录 8.5 struct结构体类型增强使用说明 8.5.1 C结构体可以定义成员函数 8.5.2 c中定义结构体变量可以不加struct关键字 8.6 bool布尔类型关键字 8.5 struct结构体类型增强使用说明 第六章对结构体的使用、内存对齐以及数组、深拷贝和浅拷贝进行了一个详细的说明&#xff0c…

【数据结构实验】排序(二)希尔排序算法的详细介绍与性能分析

文章目录 1. 引言2. 希尔排序算法原理2.1 示例说明2.2 时间复杂性分析 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现3.3 代码解析3.4 实验结果 4. 实验结论 1. 引言 排序算法在计算机科学中扮演着至关重要的角色…

Leetcode211. 添加与搜索单词 - 数据结构设计

Every day a Leetcode 题目来源:211. 添加与搜索单词 - 数据结构设计 解法1:字典树 字典树(前缀树)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。前缀树可以用 O(∣S∣) 的时间复杂度完成如下操作…

基于单片机温湿度光照自动窗帘系统设计

**单片机设计介绍, 基于单片机温湿度光照自动窗帘系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的温湿度光照自动窗帘系统是一种智能家居系统,通过使用单片机作为控制核心&#xff0c…

【IQR与MAD】原理,一文带你玩转箱型图含详细解释与代码

IQR方法 基于四分位数:使用数据的第一四分位数(25%)和第三四分位数(75%)来计算。 对称:相对于中位数对称地考虑上下界。 受极端值影响:如果数据中包含极端值,IQR可能会被拉得很大&a…

CMA认证是什么?CMA软件测试报告如何获取?

资格证书在各行各业都是一种专业性象征,如第三方检测机构的CMA认证,在相应的检测报告上加盖CMA章可获得国家以及行业认可,还是享受税收优惠的有力证明材料。 一、CMA认证是什么?   CMA是中国计量认证的简称,由省级以上人民政府…

EFCore乐观并发

在 Entity Framework Core 中,乐观并发是一种处理并发访问的方式,它允许多个用户同时访问和修改相同的数据,而不会发生冲突。乐观并发的实现通常涉及使用版本控制字段来检测数据更改,并在保存更改时检查这些字段是否与预期值匹配。…