假设rbp = 0x100
int a = 10;
00007FF75FA51F8B mov dword ptr [rbp+4],0Ah
汇编指令释义:将立即数10,放到0x104开始的内存单元中
int b = 20;
00007FF75FA51F92 mov dword ptr [rbp+24h],14h
汇编指令释义:将立即数20,放到0x124开始的内存单元中
int *p = &a;
00007FF75FA51F99 lea rax,[rbp+4]
汇编指令释义:将a的地址放到rax寄存器中,rax = 0x104
>>>>>> 拓展 内存空间布局
a = [rbp + 4]
&a = rap + 4
<<<<<<
00007FF75FA51F9D mov qword ptr [rbp+48h],rax
汇编指令释义:将rax寄存器中的值放到0x148开始的内存单元中,这是程序为指针p分配的内存空间
>>>>>> 拓展 语法使用
p = &a;
*p= a;
<<<<<<
int *&rp = p;
00007FF75FA51FA1 lea rax,[rbp+48h]
00007FF75FA51FA5 mov qword ptr [rbp+68h],rax
汇编指令释义:将p的地址0x148h放到0x168h开始的内存空间,这是程序为引用rp分配的内存空间
>>>>>> 拓展 引用声明表达式的本质
引用,相当于是C++的语法糖,
正常情况下,我们使用指针是是通过
int a = 10;
int *p = &a;
而使用了引用,我们可以省略点内容
int &rA = a;
将右边放的& 移动到左边,替代,原来的*符号,但是本质,引用仍然是指针,
指针变量就是用来存放内存地址的,所以,声明引用的时候,不管是对什么类型进行声明,
表达式的右边,都是在取地址,虽然,少了取地址运算符,
<<<<<<
int *p1 = &b;
00007FF75FA51FA9 lea rax,[rbp+24h]
00007FF75FA51FAD mov qword ptr [rbp+0000000000000088h],rax
汇编指令释义:将变量a的地址0x124h放到0x188h开始的内存空间中,
这是程序为指针p1分配的内存空间
rp = p1;
00007FF75FA51FB4 mov rax,qword ptr [rbp+68h]
rax = 0x148h
00007FF75FA51FB8 mov rcx,qword ptr [rbp+0000000000000088h]
rcx = 0x124h
00007FF75FA51FBF mov qword ptr [rax],rcx
将0x124h放到0x148h开始的内存单元中
>>>>>> 拓展
rp 是p的引用,所以修改rp,相当于就是在修改p,
类似:
int age = 10;
int &rAge = age;
rAge = 20;
cout << age << endl;
这是age的值为20;
int age = 10;
00007FF707DE192B mov dword ptr [rbp+4],0Ah
int &rAge = age;
00007FF707DE1932 lea rax,[rbp+4]
00007FF707DE1936 mov qword ptr [rbp+28h],rax
rAge = 20;
00007FF707DE193A mov rax,qword ptr [rbp+28h]
00007FF707DE193E mov dword ptr [rax],14h
cout << age << endl;
引用赋值表达式的本质
引用,相当于是C++的语法糖,
正常情况下,我们使用指针是是通过
int a = 10;
int *p = &a;
*p = 20;
而使用了引用,我们可以省略点内容
int &rA = a;
rA = 20;
通过语法糖,将表达式的左边的*操作符,给去除了,但是本质,引用仍然是指针,
而引用,在声明的时候,已经确定了,一个引用只能指向初始化时它所指向的变量,
不能再指向其它的变量,所以只能修改它所指向的变量的值,
所以,在给引用赋值的时候,可以直接查看当前引用对应着那个变量,
给引用赋值,就是在给它所对应着的变量赋值,虽然,少了*运算符
int a = 10;
int *p = &a; // p 是指向int 类型的指针,指针变量用来存储地址值,
//所以,p的内存空间里面存放的是a的地址值
int *p1 = p; // p1是指向int 类型的指针,指针变量用来存储地址值,
// 所以,p1的内存空间里面存放的是p的地址值
int **p2 = &p;
int a = 10;
00007FF6C2321F8B mov dword ptr [rbp+4],0Ah
int *p = &a;
00007FF6C2321F92 lea rax,[rbp+4]
00007FF6C2321F96 mov qword ptr [rbp+28h],rax
int *p1 = p; // 相当于是 int *p1 = &a;
00007FF6C2321F9A mov rax,qword ptr [rbp+28h]
00007FF6C2321F9E mov qword ptr [rbp+48h],rax
int **p2 = &p;
00007FF6C2321FA2 lea rax,[rbp+28h]
00007FF6C2321FA6 mov qword ptr [rbp+68h],rax
<<<<<
p = p1; // 和上条语句实现的功能相同
00007FF75FA51FC2 mov rax,qword ptr [rbp+0000000000000088h]
rax = 0x124h
00007FF75FA51FC9 mov qword ptr [rbp+48h],rax
[0x148h] = 0x124h
int &rAge = a;
00007FF75FA51FCD lea rax,[rbp+4]
00007FF75FA51FD1 mov qword ptr [rbp+00000000000000A8h],rax
[0x1A8h ] = 0x104h
rAge = 20;
00007FF75FA51FD8 mov rax,qword ptr [rbp+00000000000000A8h]
00007FF75FA51FDF mov dword ptr [rax],14h
[0x104h] = 14h
rAge = b;
00007FF75FA51FE5 mov rax,qword ptr [rbp+00000000000000A8h]
rax = 0x104h
00007FF75FA51FEC mov ecx,dword ptr [rbp+24h]
ecx = 14h
00007FF75FA51FEF mov dword ptr [rax],ecx
[0x104h] = 14h
>>>>>>
为引用赋值,
1.先取出引用所对应的变量,地址 = [引用]
2.为该变量赋值 [变量地址] = 值
<<<<<<
image.png
网友评论