VS2010查看源码对应的汇编语言

时间:2022-03-13 09:22:41

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

VS2010查看源码对应的汇编语言VS2010查看源码对应的汇编语言

左图是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 调试模式

VS2010查看源码对应的汇编语言

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

VS2010查看源码对应的汇编语言

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

 

2.windows 7系统vs2010

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

VS2010查看源码对应的汇编语言

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

VS2010查看源码对应的汇编语言

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

VS2010查看源码对应的汇编语言

 

 

 

 

 

 

 

 

 

 

VS2010查看源码对应的汇编语言

 

 

 

 

 

 

 

 

 

 

 

 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开头。