美文网首页
03-Reference&汇编

03-Reference&汇编

作者: 一亩三分甜 | 来源:发表于2021-07-17 16:47 被阅读0次

    《C++文章汇总》
    上一篇文章介绍了Extern、内联函数Inline、Const《02-Extern、内联函数、Const》,本文介绍Reference&汇编。

    1.Reference

    ◼ 在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
    ◼ 在C++中,使用引用(Reference)可以起到跟指针类似的功能

    #include <iostream>
    using namespace std;
    
    int main(int argc, const char * argv[]) {
        int age = 10;
        //定义了一个age的引用,refAge相当于是age的别名
        int &refAge = age;
        refAge = 20;
        refAge += 30;
        cout << age << endl;
        return 0;
    }
    //输出
    50
    

    ◼ 注意点

    • 引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
    • 对引用做计算,就是对引用所指向的变量做计算
    • 在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
    int main(int argc, const char * argv[]) {
        int age = 10;
        int height = 20;
        //定义了一个age的引用,ref相当于是age的别名
        int &ref = age;
        ref = 20;
        ref += 30;
        
        ref = height;
        ref = 11;
        
        cout << height << endl;
        return 0;
    }
    //输出20
    
    • 可以利用引用初始化另一个引用,相当于某个变量的多个别名
    int main(int argc, const char * argv[]) {
        int age = 10;
        //定义了一个age的引用,ref相当于是age的别名
        int &ref = age;
        int &ref1 = ref;
        int &ref2 = ref1;
        
        ref += 10;
        ref1 += 10;
        ref2 += 10;
        cout << age << endl;
        return 0;
    }
    //输出
    40
    
    • 不存在【引用的引用、指向引用的指针、引用数组】
      ◼ 引用存在的价值之一:比指针更安全、函数返回值可以被赋值
    • 交换两个值,函数每次调用都会在栈中重新开辟存储空间,不会出现int &v1,int &v2从一而终只能指向一次
    void swag(int &v1,int &v2){
        int temp = v1;
        v1 = v2;
        v2 = temp;
    }
    int main(int argc, const char * argv[]) {
        int a = 10;
        int b = 20;
        swag(a,b);
        cout << "a = " << a << "b = " << b << endl;
        int c = 1;
        int d = 2;
        swag(c,d);
        cout << "c = " << c << "d = " << d << endl;
        return 0;
    }
    //输出
    a = 20b = 10
    c = 2d = 1
    

    2.引用的本质

    ◼ 引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
    ◼ 一个引用占用一个指针的大小:ref存储的age的地址值

    int main(int argc, const char * argv[]) {
        int age = 10;
        int *p = &age;
        *p = 20;
        cout << sizeof(p) << endl;
        int &ref = age;
        ref = 22;
        cout << sizeof(&age) << endl;
        cout << sizeof(&ref) << endl;
        return 0;
    }
    

    3.汇编

    image

    A.寄存器与内存

    ◼ 通常,CPU会先将内存中的数据存储到寄存器中,然后再对寄存器中的数据进行运算
    ◼ 假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
    ➢CPU首先会将红色内存空间的值放到EAX寄存器中:mov eax,红色内存空间
    ➢然后让EAX寄存器与1相加:add eax,1
    ➢最后将值赋值给内存空间:mov 蓝色内存空间, eax


    image

    B.汇编语言的种类

    ◼ 汇编语言的种类
    8086汇编(16bit)
    x86汇编(32bit)
    x64汇编(64bit)
    ARM汇编(嵌入式、移动设备)
    ......
    ◼ x64汇编根据编译器的不同,有2种书写格式
    Intel(Windows)
    AT&T(Mac,gcc编译器)
    ◼ 汇编语言不区分大小写

    C.AT&T汇编和Intel汇编

    image

    x64汇编-寄存器


    image
    image

    D.x64汇编要点总结

    ◼mov dest, src
    将src的内容赋值给dest,类似于dest = src
    ◼[ 地址值 ]
    中括号[ ]里面放的都是内存地址
    ◼word是2字节,dword是4字节(double word),qword是8字节(quad word)
    从地址开始读都是从低地址往高地址开始吞并4字节
    mov dword ptr [1128h] 3,吞进去之后怎么排列4个字节顺序与大小端模式有关了,小端模式从高地址往低地址开始读,一个变量的地址值,是它所有字节地址中的最小值
    ◼call 函数地址
    调用函数
    ◼lea dest, [ 地址值 ]
    将地址值赋值给dest,类似于dest = 地址值
    ◼ret
    函数返回
    ◼xor op1, op2
    将op1和op2异或的结果赋值给op1,类似于op1 = op1 ^ op2
    ◼ 一个变量的地址值,是它所有字节地址中的最小值

    E.CPU大小端模式,大部分都是小端模式(高高低低,高字节放高地址,低字节放低地址)

    mov dword ptr [1128h] 3
    内存地址 内容
    1122h
    1123h
    1124h
    1125h
    1126h
    1127h
    1128h 00000011
    1129h 00000000
    112Ah 00000000
    112Bh 00000000
    112Ch

    16进制
    00 00 00 03H

    2进制
    00000000 00000000 00000000 00000011

    相关文章

      网友评论

          本文标题:03-Reference&汇编

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