博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2010查看源码对应的汇编语言
阅读量:5121 次
发布时间:2019-06-13

本文共 2090 字,大约阅读时间需要 6 分钟。

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

转载于:https://www.cnblogs.com/phillee/p/10686815.html

你可能感兴趣的文章
[BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP
查看>>
super 小记
查看>>
C语言实现<读取>和<写入> *.ini文件(转)
查看>>
【架构】Linux的架构(architecture)
查看>>
从解决Cocos2dx-2.x arm64 Crash 来看C的奇技淫巧
查看>>
ASM 图解
查看>>
石子合并(一)
查看>>
Hibernate批量删除的两种方式
查看>>
Maven入门指南③:坐标和依赖
查看>>
MVC 校验
查看>>
Atheros AR9485 ubuntu 10.04 驱动安装及networking disable问题解决
查看>>
linux开发缩写
查看>>
java基础第十六篇之多线程
查看>>
3527: [Zjoi2014]力 - BZOJ
查看>>
17 , CSS 区块、浮动、定位、溢出、滚动条
查看>>
屏蔽元素默认样式中的边距
查看>>
bzoj1084(SCOI2005)最大子矩阵
查看>>
BZOJ2563 阿狸和桃子的游戏
查看>>
3. Scheme约束XML
查看>>
Tensorflow一些常用基本概念与函数(四)
查看>>