zoukankan      html  css  js  c++  java
  • 引用在汇编层次上面的解释

    ubuntu18(g++、gdb)
     
    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    
    int main(){
        int x = 1;
        int y = 2;
        int &b = x;
        return 0;
    }
    编译带参数 -g

    gdb ./程序名

    break main
    run
    display/i $pc

    相关结果如下:

    7 int x = 1;
    1: x/i $pc
    => 0x5555555547c1 <main()+23>: movl $0x1,-0x18(%rbp)
    (gdb)
    8 int y = 2;
    1: x/i $pc
    => 0x5555555547c8 <main()+30>: movl $0x2,-0x14(%rbp)
    (gdb)
    9 int &b = x;
    1: x/i $pc
    => 0x5555555547cf <main()+37>: lea -0x18(%rbp),%rax
    (gdb)
    10 return 0;

    解释如下:(自己瞎猜的,好像是最新的g++生成的汇编代码和老版本的汇编代码不太一样了,也可能是我命令输入的和其他对方不一样)
    => 0x5555555547c1 <main()+23>: movl $0x1,-0x18(%rbp) 把 $0x1的值放入到地址 -0x18 中
    => 0x5555555547cf <main()+37>: lea -0x18(%rbp),%rax 把 地址 -0x18这个地址放到寄存器 rax 中

    从汇编层次上来看,引用的确是通过指针来实现的

    第二次测试:
    命令如下:
    g++ -g -c cite.cpp
    objdump -S cite.o
    int x = 1;
    17: c7 45 ec 01 00 00 00 movl $0x1,-0x14(%rbp)
    int &b = x;
    1e: 48 8d 45 ec lea -0x14(%rbp),%rax
    22: 48 89 45 f0 mov %rax,-0x10(%rbp)


    参考:https://www.cnblogs.com/xkfz007/archive/2012/02/05/2338758.html


  • 相关阅读:
    第04组 Alpha冲刺(1/6)
    第04组 团队Git现场编程实战
    第04组 团队项目-需求分析报告
    Codeforces 652F 解题报告
    团队项目-选题报告
    php 基础 字符串转整形
    php 基础 判断类型
    php 基础 自动类型转换
    php 算false的情况
    php redis 集群扩展类文件
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/14641094.html
Copyright © 2011-2022 走看看