美文网首页
2019-04-09

2019-04-09

作者: ngugg | 来源:发表于2019-04-09 08:56 被阅读0次
假设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

相关文章

网友评论

      本文标题:2019-04-09

      本文链接:https://www.haomeiwen.com/subject/ekyviqtx.html