当前位置: 首页 > news >正文

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.lryc.cn/news/246566.html

相关文章:

  • 全网最全卡方检验汇总
  • Java基础-中级-高级面试题汇(一)
  • 数据结构 / day04 作业
  • Java核心知识点整理大全20-笔记
  • Spark---转换算子、行动算子、持久化算子
  • 什么是关系型数据库?
  • 【LeetCode】挑战100天 Day12(热题+面试经典150题)
  • ArcGIS10.x系列 Python工具箱教程
  • 【蓝桥杯】刷题
  • 软件产品登记的材料条件
  • 春节后跟进客户开发信模板?外贸邮件模板?
  • 个人财务管理软件CheckBook Pro mac中文版特点介绍
  • rfc4301- IP 安全架构
  • 【数据结构/C++】线性表_双链表基本操作
  • 前端已死?看看我的秋招上岸历程
  • Flink Flink中的合流
  • 工业园区重金属废水深度处理工程项目,稳定出水0.1mg/l
  • element table滚动条失效
  • 代码随想录算法训练营 ---第四十六天
  • MySQL-02-InnoDB存储引擎
  • Qt路径和Anaconda中QT路径冲突(ubuntu系统)
  • vue2.js添加水印
  • Eureka简单使用做微服务模块之间动态请求
  • 竞赛选题 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉
  • css-tricks网站图例
  • Scrapy框架内置管道之图片视频和文件(一篇文章齐全)
  • Linux文件与路径
  • 【Qt】获取当前系统用户名:9种获取方式
  • ECMAScript2023你学习了吗?
  • 【从删库到跑路 | MySQL总结篇】数据库基础(增删改查的基本操作)