在学习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开头。