c++引用的本质(反汇编角度分析)

目录

 一、引用基础理论

二、 引用的本质

三、从反汇编角度进行分析 

1.变量赋值

2.引用和指针初始化

3.通过引用和指针赋值

4.eaxd的作用


 一、引用基础理论

        在c++中我们都知道,引用(&)就是变量的一个别名,它允许我们为已存在的变量创建一个新的名字。

        引用的作用:引用和它所引用的变量共享同一块内存地址。当对引用进行修改时,实际上是对它所引用的变量进行修改,因为两者指向的是同一块内存空间。

二、 引用的本质

如图所示:

三、从反汇编角度进行分析 

分析这行代码:

int a = 10;  
a = 12;  int& b = a;  
int& c = a;  
int* d = &a;  b = 18;  
c = 18;  
*d = 6;  

反汇编代码角度分析:

1.变量赋值
int a = 10;
0052182F  mov         dword ptr [a],0Ah  a = 12;
00521836  mov         dword ptr [a],0Ch  

        这两行代码通过直接内存操作(mov dword ptr [a], value)来设置a的值,可以理解为dword ptr [a]为变量a的地址,oAh为十六进制,这里指把a的地址赋值为10。

2.引用和指针初始化
 int& b = a;
0052183D  lea         eax,[a]  
00521840  mov         dword ptr [b],eax  int& c = a;
00521843  lea         eax,[a]  
00521846  mov         dword ptr [c],eax  int* d = &a;
00521849  lea         eax,[a]  
0052184C  mov         dword ptr [d],eax  

         这里可以看到引用和指针的反汇编代码都是一样的写法。

代码解析:

         这三行代码通过lea eax, [a]指令将a的地址加载到eax中,然后将这个地址存储到b和c中(尽管在汇编级别,它们可能只是内存中的连续字节)。eax在这里用作中间存储地址的寄存器

3.通过引用和指针赋值
  b = 18;
0052184F  mov         eax,dword ptr [b]  
00521852  mov         dword ptr [eax],12h  c = 18;
00521858  mov         eax,dword ptr [c]  
0052185B  mov         dword ptr [eax],12h  *d = 6;
00521861  mov         eax,dword ptr [d]  
00521864  mov         dword ptr [eax],6  

代码解析:

        首先通过mov eax, dword ptr [b/c/d]将引用b或c,d所指向的地址加载到EAX中,然后通过mov dword ptr [eax], 12h将值18(在十六进制中为12h)存储到该地址所指向的内存位置。

4.eaxd的作用

        在这个例子中,eax被用作一个中间寄存器,用于存储地址值,以便在后续的内存操作中使用。这是汇编语言中常见的模式,因为寄存器提供了快速访问和操作数据的方式。

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

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

相关文章

Python魔法之旅专栏(导航)

目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先,感谢老铁们一直以来对我的支持与厚爱,让我能坚持把Python魔法方法专栏更新完毕! 其次,为了方便大家查阅,我将此专栏…

C#操作MySQL从入门到精通(21)——删除数据

前言: 谈到数据库,大家最容易脱口而出的就是增删改查,本文就是来详细介绍如何删除数据。 本文测试使用的数据库如下: 1、删除部分数据 使用delete 关键字,并且搭配where条件使用,否则会导致表中数据全部被删除 string sql = string.Empty;if (radioButton_DeletePart…

保存图片奇怪的bug

今天发现一个奇怪的bug 这个的dpi是100de ,但是我取完切片之后,发现这个结果就变了

Vivado时序报告之Datasheet详解

目录 一、前言 二、Datasheet配置选项说明 2.1 Options 2.2 Groups 2.3 Timer Settings 2.4 Common Options 三、Datasheet报告 3.1 General Information 3.2 Input Ports Setup/Hold 3.3 Output Ports Clock-to-out 3.4 Setup between Clocks 3.5 Combinational…

保姆级讲解 Linux下FTP服务器的搭建、配置与管理

本来目录很长的 因为感觉不太美观 所以小标题都删掉了 本文介绍了 本地用户的FTP服务器搭建实例匿名用户的FTP服务器搭建实例虚拟用户的FTP服务器搭建实例企业常见类型搭建实验 配置与管理FTP服务器 配置与管理FTP服务器一、FTP相关知识二、项目设计与准备三、项目实施四、认识…

【最新鸿蒙应用开发】——ArkUI两种开发范式

在进行鸿蒙应用开发,openHarmony提供了一种页面开发框架叫做ArkUI方舟框架来进行页面布局的开发。 ArkUI方舟UI框架 针对不同的应用场景及技术背景,方舟UI框架提供了两种开发范式,分别是基于ArkTS的声明式开发范式(简称“声明式…

[书生·浦语大模型实战营]——LMDeploy 量化部署 LLM 实践

1.基础作业 1.1配置 LMDeploy 运行环境 创建开发机 创建新的开发机,选择镜像Cuda12.2-conda;选择10% A100*1GPU;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像,新版本的lmdeploy会出现兼容性问题。其他和之前一样&…

转型AI产品经理(6):“ 序列位置效应”如何应用在Chatbot产品中

序列位置效应是心理学中的一个记忆现象,指的是人们对一系列信息的记忆效果受到信息在序列中位置的影响。具体来说,人们通常更容易记住列表的开头和结尾部分的项目,而对中间部分的项目记忆较差。这个效应可以进一步分为“首因效应”和“近因效…

VSCode超过390万下载的请求插件

Thunder Client 是一款在 VSCode(Visual Studio Code)中非常受欢迎的 REST API 客户端插件,由Ranga Vadhineni开发,现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求,查看响应。Thunder Client…

简单介绍一下vim

简单介绍一下vim 一、vim是什么?二、vim的优点三、vi/vim的使用命令模式输入模式底线命令模式 四、vi/vim 按键说明(一)命令模式可用的光标移动、复制粘贴、搜索替换等移动光标的方法:搜索替换的方法删除、复制与贴上的方法 (二&a…

【算法】常用排序算法(插入排序、希尔排序、堆排序、选择排序、冒泡排序、快速排序、归并排序、计数排序)超详细

排序算法是数据结构相关知识中非常重要的一节,相信很多小伙伴对这部分知识一知半解。那么接下来,小编就要带领大家一起来进行对排序算法的深入剖析学习,希望本篇文章能够使你有所收获! 一.常见的排序算法 排序算法有很多种&#…

LINUX网络FTP服务

一、FTP服务 FTP服务:file transfer protocol :文件传输协议。在网络上进行双向传输,也是一个应用程序。不同的操作系统有不同的FTP软件,但使用的协议是一样的。 FTP协议基于TCP协议,有两个端口,即20和21。 20端口&…

基于xml的Spring应用(理解spring注入)

目录 问题: 传统Javaweb开发的困惑? 问题: IOC、DI和AOP的思想提出 问题: Spring框架的诞生 1. BeanFactory快速入门 2. ApplicationContext快速入门 3. BeanFactory和ApplicationContext的关系 基于xml的Spring应用 1. SpringBean的…

jmeter性能优化之mysql配置

一、连接数据库和grafana 准备:连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等,还有过节像618,双11和数据库交互非常庞大,都会存在数据库的某一张表里面,当用户在登录或者查询某一个界面时&…

Java入门基础11:面向对象高级一(static、extends继承)

Java面向对象高级特性有以下几个:继承,多态,封装,抽象,接口,匿名内部类,静态成员,final关键字,异常处理等。 我会将它分为三章详细讲,本章主要讲静态和继承 …

算法导论实战(六)(算法导论习题三十四、三十五章)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀算法启示录 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 前言 算法导论的知识点学习将持续性更新在算…

第十四周 6.4 内部类部分知识点

一、理解 1.定义在一个类内部的类称为内部类 2.语法: class 类名{ class 类名{} } 3.内部类编译之后生成独立的.class文件,文件命名为:外部类类名$内部类的类名.class 4.内部类分类:成员内部类、静…

初阶 《函数》 2.C语言中函数的分类

2.C语言中函数的分类 1.库函数 2.自定义函数 2.1 库函数 为什么会有库函数? 1.我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能…

Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路

目录 写在前面Nginx04LNMP流程详解Nginx处理静态资源流程Nginx处理动态资源流程 LNMP排错LinuxNginxPHPMysql Nginx 代理概述正向代理反向代理区别 反向代理实验(Proxy模块)环境准备front配置lb01配置测试流程梳理总结 写在前面 这是Nginx第四篇&#xf…