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

相关推荐

  1. 38. C++ 引用本质

    2024-06-10 11:28:02       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-10 11:28:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-10 11:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-10 11:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-10 11:28:02       18 阅读

热门阅读

  1. Git常用命令

    2024-06-10 11:28:02       9 阅读
  2. python-win10跑通chattts笔记(亲测可跑)0.8.010

    2024-06-10 11:28:02       9 阅读
  3. 列举常见的SQL语句

    2024-06-10 11:28:02       10 阅读
  4. 谈谈 Tomcat 连接器

    2024-06-10 11:28:02       7 阅读