gcc 编译为汇编代码

原始C++代码如下:

#include "stdio.h"

class Animal {

public:

virtual void name() { printf("I'm Animal"); }

};

class Cat : public Animal {

public:

virtual void name() override { printf("I'm Cat"); }

};

void func(Animal *animal) {

animal->name();

}

int main(void) {

func(new Animal());

func(new Cat());

return 0;

}

编译成汇编代码:

g++ -S test.cpp -o test.s

查看:

cat test.s

部分结果:

main:

.LFB3:

.cfi_startproc

pushq %rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq %rsp, %rbp

.cfi_def_cfa_register 6

pushq %rbx

subq $8, %rsp

.cfi_offset 3, -24

你发现你完全看不懂

使用 as 展示汇编代码

另一种更好的做法是使用as:

编译成汇编代码:

g++ -S -fverbose-asm -g test.cpp -o test.s

查看:

as -alhnd test.s

现在是把代码和汇编代码对应起来了:

16:test.cpp ****

17:test.cpp **** int main(void) {

202 .loc 1 17 16

.........

212 # test.cpp:18: func(new Animal());

18:test.cpp **** func(new Animal());

213 .loc 1 18 21

214 002b BF080000 movl $8, %edi #,

214 00

215 0030 E8000000 call _Znwm #

215 00

216 0035 4889C3 movq %rax, %rbx # tmp86, _3

217 0038 48C70300 movq $0, (%rbx) #, MEM[(struct Animal *)_4]._vptr.Animal

217 000000

218 003f 4889DF movq %rbx, %rdi # _3,

219 0042 E8000000 call _ZN6AnimalC1Ev #

219 00

220 # test.cpp:18: func(new Animal());

这种情况看汇编代码比刚才更清楚一些。

使用 objdump 进行反汇编

如果直接编成机器码,需要使用objdump进行反汇编:

g++ -save-temps -fverbose-asm -g -o test test.cpp

objdump -S --disassemble test

效果如下:

0000000000400654 :

int main(void) {

400654: 55 push %rbp

400655: 48 89 e5 mov %rsp,%rbp

400658: 53 push %rbx

400659: 48 83 ec 08 sub $0x8,%rsp

func(new Animal());

40065d: bf 08 00 00 00 mov $0x8,%edi

400662: e8 d9 fe ff ff callq 400540 <_znwm>

400667: 48 89 c3 mov %rax,%rbx

40066a: 48 c7 03 00 00 00 00 movq $0x0,(%rbx)

400671: 48 89 df mov %rbx,%rdi

400674: e8 6d 00 00 00 callq 4006e6 <_zn6animalc1ev>

400679: 48 89 df mov %rbx,%rdi

40067c: e8 b1 ff ff ff callq 400632 <_z4funcp6animal>

感觉使用objdump效果最好,但还有效果更好的。

使用 godbolt 可视化结果

这个网站: https://godbolt.org

真的非常好用,效果如下:

非常炫酷,而且一一对应。

如果你想学C/C++可以私信小编“01”获取素材资料以及开发工具和听课权限哦

vs cpp代码 添加汇编_C++ 汇编代码查看相关推荐

  1. css代码添加背景图片常用代码

    css代码添加背景图片常用代码 1 背景颜色 {background-color:数值} 2 背景图片 {background-image: url(url)|none} 3 背景重复 {backgr ...

  2. 【Windows 逆向】OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )

    文章目录 一.添加硬件断点 二.关键代码 三.MOV 汇编指令格式 四.EAX 寄存器值分析 五.使用命令查看 esi+0cc 地址 一.添加硬件断点 在上一篇博客中 , 在子弹个数数据内存地址 07 ...

  3. 学籍管理系统文件版c语言代码,学籍管理系统_c语言代码

    通过结构体.动态存储函数建立单向链表,结合文件操作函数和指针实现对大量有序同类型数据(学生信息)的处理. #include #include #include #include #define NAM ...

  4. MGraph图(代码、分析、汇编)

    目录: 代码: 分析: 汇编: MGrapth图表示有邻接矩阵的方式构成的图结构. 邻接矩阵用两个数组保存数据,一个一维数组存储图中的顶点信息,一个二维数组存储图中边或弧的信息. 无向图中的二维数组是 ...

  5. 二叉树遍历(代码,分析,汇编)

    目录: 代码: 分析: 汇编: 代码: BTree.h BTree.c 二叉树(多路平衡搜索树) LinkQueue.h #ifndef _LINKQUEUE_H_ #define _LINKQUEU ...

  6. 栈应用_检测成对符号是否正确使用(代码、分析、汇编)

    目录: 代码: 分析: 汇编: 代码: LinkList.h LinkList.c LinkStack.h LinkStack.c 栈-线性表 main.c #include <stdio.h& ...

  7. 栈-顺序表(代码、分析、汇编)

    目录: 代码: 分析: 汇编: 代码: SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_typedef void SeqList;//定义顺序表类型 ...

  8. 栈-线性表(代码、分析、汇编)

    目录: 代码: 分析: 汇编: 代码: LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //定义链 ...

  9. stm32启动过程、cortex-m3架构、堆栈代码位置、编译汇编链接分析

    分析 一. 寄存器.架构.工作流程 1. 寄存器架构 二 .总线与各个部件之间的关系(主要是I-Code Bus.D-Code Bus.System Bus) 体系结构:哈佛结构与冯诺依曼结构的区别 ...

最新文章

  1. php操作mysql数据库,PHP操作mysql数据库
  2. 采集网站特殊文件Meta信息
  3. 深拷贝拯救指针重复释放(浅拷贝)造成的内存泄漏
  4. windows7黑屏修复_如何在Windows 10更新后修复黑屏
  5. 详述由ENQ:TX – ROW LOCK CONTENTION引起的全局死锁处理过程
  6. 强化学习ppt_强化学习和最优控制的十个关键点81页PPT汇总
  7. 【报告分享】2020-2021视频号发展现状与趋势.pdf(附下载链接)
  8. SpringBoot-文件在线预览解决方案-基于OpenOffice及jacob
  9. java blowfish ecb,node.js – 使用nodejs crypto和php的mcrypt解密blowfish-ecb
  10. c语言自学的代码表示,【图片】c语言初级代码练习自学【编程吧】_百度贴吧...
  11. 第十四届全国大学生智能汽车竞赛获奖名单
  12. SMS模型格网转换为MIKE21的格网源代码
  13. WebPlayer9电影整站系统第三方电影批量添加工具
  14. 2.2、云计算FusionCompute计算虚拟化
  15. Hibernate报错org.hibernate.MappingException: Unknown entity解决方法
  16. 软件测试之黑盒测试方法介绍及测试用例练习
  17. postgresql计算两点距离
  18. ❤️微信小程序 云开发 教程合集(视频+图文)免费❤️
  19. 平行束投影数据的仿真
  20. torch.cat()函数 ,关于四维tensor维度合并。

热门文章

  1. C++::My Effective C++
  2. fpga多摩川编码器开源代码_F28379D之CLB解码多摩川编码器1——入手小知识(原创)...
  3. 计算机信息技术基础知识教案,计算机的基础知识
  4. python 生成器_python 生成器 - 刘江的python教程
  5. python入门经典-入门python有什么好的书籍推荐?
  6. python语言能做什么-python语言用来干什么
  7. python菜鸟教程-Python3 函数
  8. php json 小红点,关于PHP的json_encode的一个小技巧
  9. php生成站点地图,php生成百度站点地图sitemap.xml
  10. linux向脚本传递参数,Linux 使用位置变量向脚本传递参数