zoukankan      html  css  js  c++  java
  • VS2010查看源码对应的汇编语言

    在学习c++中const关键字的过程中,经常会看到各种寄存器、汇编指令分析,像下面的图这样

    左图是g++中反汇编的效果,右图是vs中反汇编的效果。

    如果我们想要查看源码所对应的汇编语言,应该怎么操作呢?

    1.ubuntu系统g++

    g++中一般使用GDB进行调试。

    .
    ├── build
    ├── CMakeLists.txt
    ├── include
    │   └── CMakeLists.txt
    └── src
        └── consttest.cc

    我的工程文件下文件结构如上所示,进行 cmake .. && make之后 build 文件夹下

    build
    ├── CMakeCache.txt
    ├── CMakeFiles
    │   ├── 3.5.1
    │   │   ├── CMakeCCompiler.cmake
    │   │   ├── CMakeCXXCompiler.cmake
    │   │   ├── CMakeDetermineCompilerABI_C.bin
    │   │   ├── CMakeDetermineCompilerABI_CXX.bin
    │   │   ├── CMakeSystem.cmake
    │   │   ├── CompilerIdC
    │   │   │   ├── a.out
    │   │   │   └── CMakeCCompilerId.c
    │   │   └── CompilerIdCXX
    │   │       ├── a.out
    │   │       └── CMakeCXXCompilerId.cpp
    │   ├── cmake.check_cache
    │   ├── CMakeDirectoryInformation.cmake
    │   ├── CMakeOutput.log
    │   ├── CMakeTmp
    │   ├── consttest.dir
    │   │   ├── build.make
    │   │   ├── cmake_clean.cmake
    │   │   ├── CXX.includecache
    │   │   ├── DependInfo.cmake
    │   │   ├── depend.internal
    │   │   ├── depend.make
    │   │   ├── flags.make
    │   │   ├── link.txt
    │   │   ├── progress.make
    │   │   └── src
    │   │       └── consttest.cc.o
    │   ├── feature_tests.bin
    │   ├── feature_tests.c
    │   ├── feature_tests.cxx
    │   ├── Makefile2
    │   ├── Makefile.cmake
    │   ├── progress.marks
    │   └── TargetDirectories.txt
    ├── cmake_install.cmake
    ├── consttest
    └── Makefile

    step 1:产生我们的可执行文件 consttest 后,在 build 路径下输入 gdb consttest 会进入到 gdb 调试模式

    step 2:然后再输入 disassemble consttest 进入下面的状态

    step 3:查看完后自动退出,gdb模式下键入q退出调试。

    2.windows 7系统vs2010

    step 1:在main函数的某个位置设置一个断点

    step 2:菜单栏中调试-->启动调试,或者直接使用快捷键F5

    step 3:在上一步之后程序应该运行到断点所在行,此时调试-->窗口-->反汇编就能进入到反汇编状态

     3. 汇编语言基本术语

    ESP(Extended Stack Pointer): 堆栈指针,寄存器存放当前线程的栈顶指针;    例如用ebp保存当前栈指针: move ebp, esp

    EBP(Extended Base Pointer): 基址指针,寄存器存放当前线程的栈底指针;   例如将基址指针压入栈: push ebp

    EIP:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完成当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行;

    EAX: 累加器(Accumulator),加法乘法指令的缺省寄存器;

    EBX: 基地址(Base)寄存器,在内存寻址时存放基地址;

    ECX:计数器(Counter),是重复(REP)前缀指令和LOOP指令的内定计数器;

    EDX:存放整数除法产生的余数;

    ESI/EDI: 源/目标索引寄存器(Source/Destination Index), 在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串。

    开头字母好像跟CPU架构有关,x86是32位系统以e开头,x86-64是64位系统以r开头。

  • 相关阅读:
    java 多级图的最短路径
    在dos中编译java文件
    apollo客户端的长轮询机制的原理
    Apollo配置中心动态生效实现原理
    jmx_exporter+prometheus+grafana实现kafka metric监控
    XXL-JOB(1) 分布式任务系统选型和XXL-JOB介绍,这篇文章相当的经典呀
    grafana根据不同prometheus server统计数据
    XXL-JOB的使用教程
    普罗米修斯官方文档
    Prometheus标签的管理
  • 原文地址:https://www.cnblogs.com/phillee/p/10686815.html
Copyright © 2011-2022 走看看