C++程序的编译的时候会把C++代码翻译为汇编代码,然后再把汇编代码转换为obj文件,也就是obj文件里描述了汇编代码的逻辑,我们可以通过工具来把obj文件转换为汇编代码,objconv就是其中一种工具。

objconv用法

下载:https://github.com/gitGNU/objconv
下载后解压。

压缩包里已经有可以直接使用的exe了,找一个任意的obj文件,复制到objconv目录下,进入命令行,执行以下命令。(我用的obj文件是main.obj)

.\objconv-debug.exe -fyasm .\main.obj main.asm


执行成功之后,会生成一个main.asm文件,打开文件就能看到汇编代码了。

总结

结合以上例子的代码来分析。

sub     rsp, 24                     //rsp表示栈顶指针,-24是压栈
mov     dword [rsp+4H], 10          //在栈顶往后偏移4个字节处填入10,定义变量a
mov     dword [rsp], 15             //在栈顶位置填入15,定义变量b
mov     eax, dword [rsp]            //把变量b的值放入寄存器eax
mov     ecx, dword [rsp+4H]         //把变量a的值放入寄存器ecx
add     ecx, eax                    //两个寄存器相加
mov     eax, ecx                    //把结果放到eax,eax寄存器用作存放函数的返回值
add     rsp, 24                     //出栈
ret

汇编代码与C++的逻辑相符。
分析以上例子可以看到以下几点。
1、进入一个函数时,rsp指针会往前偏移一定的长度,定义的局部变量会存放在这个区间内,函数退出时,rsp会恢复原位,所以函数中的局部变量会在函数结束时被释放。
2、如果函数的调用栈过多,rsp会一直减,而rsp是有限的,减到一定值就不能再减下去了,这也是函数栈溢出的原理。
3、创建变量时,new出来的变量被放在堆,而被直接创建的变量是存在栈,这里的栈应该就是rsp指针所在的栈。
使用反汇编可以直接看到C++程序的实现过程,对了解原理有一定的帮助。

C++反汇编obj文件(objconv)相关推荐

  1. g++基本用法 objdump 查看输出obj文件

    生成一个可执行文件.包括两部分:编译阶段,链接阶段. 编译阶段包括三个步骤. 预处理,编译,汇编  ----> 生成obj文件: 链接阶段包括两个步骤. 对obj文件的合并,符号表合并后,对符号 ...

  2. linux 编译C语言代码后产生OBJ文件的方法

    如果你不指定编译成什么文件,gcc默认一步到位,直接生成可执行文件你可以试试以下几个参数 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他 ...

  3. opengl关于obj文件相关知识

    首先看一下obj文件格式: obj文件中可以有v(顶点位置).vt(顶点纹理坐标).vn(顶点法向量).f(面)开头的四种类型数据. 所有的obj文件中都有v型数据.格式如下: v 0.437500 ...

  4. Obj文件和Bin文件

    本文导读:在用visual studio 编程时,会看到项目文件中含有bin和obj这两个文件夹,那么这两个文件夹具体包含一些什么东西的,具体作用是什么? 一.Bin文件夹 1.用来保存项目生成后程序 ...

  5. keil obj 文件 结构_OBJ文件格式详解

    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...

  6. 关于bin和obj文件夹。debug 和release的区别(转)

    关于bin和obj文件夹. 楼主hcaihao(影子男孩)2002-05-29 20:04:24 在 .NET技术 / C# 提问 VS.Net会生成bin和obj文件夹以及它们下面的Debug和Re ...

  7. makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开......

    我在Linux下编成时,用Makefile文件生成的.o文件老是跟我的源文件在同一个目录下,搞得我用TAB键之余还得先再敲.c再TAB,为什么要多敲两次键盘?如果我把所有生成的.o文件放比如./obj ...

  8. 链接学习之obj文件探索

    Windows的gcc环境,往官网http://sourceforge.net/project/showfiles.php?group_id=2435 下载MinGW,安装,安装完毕后按照包 配置环境 ...

  9. Qt|OpenGL对obj文件的认识以及如何去解析(opengl+qt构造地球模型)

    首先来个简单点的.obj文件(如下图所示): 总体处理伪代码如下: void GraphicsModel::init(const QString filePath) {QFile file(fileP ...

最新文章

  1. Spring 依赖注入(二、注入参数)
  2. 在此之前的软件系统做开发—需求的研究框架
  3. 网络营销理论模型_网络营销:课堂笔记(第四章下)
  4. 华为鸿蒙OS 2.0 发布,18点18分开放源代码
  5. win10装python3.6_win10+python3.6,安装tensorflow
  6. phpcmsV9 如何开启“会员注册” - 教程篇
  7. php多个地方ping,同时ping多个ip找了最快的ip网的php实例-PHP源码
  8. Apache 服务器 参数设置
  9. 【Flink】Flink Max 和 MaxBy的区别
  10. JDK、JRE、JVM的区别及JavaSE、JavaEE和JavaME的区别?
  11. 第 17 章 垃圾回收器
  12. 微软Windows家族一览 从1.0到Longhorn
  13. 线程安全list_多线程开发之如何创建一个线程安全的类
  14. 通过jQuery Ajax使用FormData对象上传文件
  15. @Responsebody与@RequestBody
  16. 删除win10添加的网络位置
  17. c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据
  18. ie浏览器html状态栏隐藏,我的IE浏览器忽然上面的菜单栏及地址栏都不见了
  19. 学生DW静态网页设计—西安旅游-高质量(9页) HTML+CSS+JavaScript 学生DW网页设计
  20. Blender 画正四面体

热门文章

  1. 1113驱动信息检索
  2. RTKLIB :postpos(后处理)
  3. 大数据技术之Hive SQL题库-中级
  4. unity 3D模型展示旋转缩放
  5. Redis Hset使用中的小坑
  6. 一加手机2 twrp/root
  7. 如何充分利用WPBeginner的免费资源
  8. 优化加载百度地图中的各种省份的js文件
  9. uniapp复制功能
  10. ubuntu 修改文件所有者