1
2
3
4
int main(int argc,char** argv)
{
return 1;
}

1
g++ -S test.cpp

生成test.s汇编文件

.file"null-test.cpp"
  .text
  .globl    main
  .type main, @function
main:
.LFB0:
  .cfi_startproc     pushq  %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq  %rsp, %rbp
  .cfi_def_cfa_register 6
  movl  %edi, -4(%rbp)
  movq  %rsi, -16(%rbp)
  movl  $1, %eax
  popq  %rbp
  .cfi_def_cfa 7, 8     ret
  .cfi_endproc  //在函数结束的时候使用与.cfi_startproc相配套使用
.LFE0:
  .size main, .-main
  .ident   "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
  .section  .note.GNU-stack,"",@progbits

  看到上面有一些语句如

cfi_def_cfa  cfi_endproc  cfi_startproc的命令,这些前面都有个关键字cfi  它是Call Frame infromation的意思。

                                      查看堆栈的信息

id="iframe_0.622272088425234" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Call_stack_layout.svg/342px-Call_stack_layout.svg.png?_=2950718%22%20style=%22border:none;max-width:614px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.622272088425234',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; border-style: none; border-width: initial; width: 342px; height: 279px;">

CFA是什么意思就不太清楚了 可能是control flow analysis的意思吧?

.cfi_startproc   用在每个函数的开始,用于初始化一些内部数据结构
.cfi_endproc   在函数结束的时候使用与.cfi_startproc相配套使用
.cfi_def_cfa_offset 16
1
2
.cfi_def_cfa_offset offset
.cfi_def_cfa_offset modifies a rule for computing CFA. Register remains the same, but offset is new. Note that it is the absolute offset that will be added to a defined register to compute CFA address.

.cfi_def_cfa 7, 8

 
1
2
.cfi_def_cfa register, offset    
.cfi_def_cfa defines a rule for computing CFA as: take address from register and add offset to it.




.cfi_def_cfa_register 6

1
2
.cfi_def_cfa_register register
.cfi_def_cfa_register modifies a rule for computing CFA. From now on register will be used instead of the old one. Offset remains the same.

 

.cfi_offset 6, -16

1
2
3
.cfi_offset register, offset
Previous value of register is saved at offset offset from CFA.



.cfi_startproc 和 .cfi_endproc 分别是 dwarf2 CFI 的初始过程和结束过程指令,它们隐藏了一些 CFI 有关的操作。ret 是从当前过程中返回的指令。这就是一个最简单的 main 函数内部的三个步骤:CFI 初始操作 – 返回 – CFI 结束操作。由于第一个和最后一个步骤永远伴随着函数,我们大可将注意力集中在这两个步骤之间的代码,也就是 main 函数的实际内容。



eax 是一个通用的寄存器,根据 cdesl 调用约定(即 C 语言调用约定),在函数返回时,返回值必须保存在 eax 寄存器中,交给调用者处理。

 

rbp寄存器 是ebp寄存器64位扩展,ebp寄存器扩展基址指针寄存器(extended base pointer)  其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。BP

为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据,它的作用是在调用函数时保存ESP使函数结束时可以正确返回;加E(enhance)代表增强型寄存器,用于32位数据处理。
 

EAX也是一种32位通用寄存器。 EAX寄存器称为累加器,AX寄存器是算术运算的主要寄存器,所有的输入、输出只使用AL或AX人作为数据寄存器。在80386及其以上的微处理器中,EAX寄存器可以用来存储单元偏移地址

将数据33221100H传送到EAX寄存器的指令

EAX可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位进行访问。它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。

.file.text, etc are assembler directives.

.LFB0.LFE0 are local labels, which are normally used as branch destinations within a function.

分析.cpp文件编译生成的汇编文件里语句的作用相关推荐

  1. VSCode将Java文件编译生成的class文件存在哪的?

    记录一下,有问题欢迎指正^_^ 默认存储在: C:\Users{your_name}\AppData\Roaming\Code\User\workspaceStorage 这个文件夹下会创建项目对应的 ...

  2. 服务器里解压缩gz文件夹,Shell命令文件压缩解压缩之gzip、zip的案例分析

    Shell命令文件压缩解压缩之gzip.zip的案例分析 发布时间:2020-11-13 10:32:36 来源:亿速云 阅读:114 作者:小新 小编给大家分享一下Shell命令文件压缩解压缩之gz ...

  3. .CS文件编译生成.DLL文件 .EXE文件(C#网络搜集)(转)

    如果没有VS用下面的办法 搜索csc.exe 打开cmd 转到csc.exe的文件夹 运行 csc /t:library N:\NET\cs\*.cs   N:\NET\cs\*.cs  是你的cs文 ...

  4. CM3启动汇编文件详解

    转载地址:http://www.360doc.com/content/18/0502/16/496343_750516698.shtml 一.启动文件解析 启动文件由汇编编写,是系统上电复位后第一个执 ...

  5. .CS文件编译生成.DLL文件 .EXE文件

    如果没有VS用下面的办法 搜索csc.exe 打开cmd 转到csc.exe的文件夹 运行 csc /t:library N:\NET\cs\*.cs   N:\NET\cs\*.cs  是你的cs文 ...

  6. 用ATL创建COM组件(详细分析了ATL创建的各种文件的意义,看完之后ATL就入门了)

       转载自: http://www.cppblog.com/ice197983/articles/4178.html 其他不错的资源: http://technet.microsoft.com/zh ...

  7. PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

    MS 2.0节是PE文件格式中第一个"节".其大致结构如下:(转载请指明来源于breaksoftware的csdn博客) 在VC\PlatformSDK\Include\WinNT ...

  8. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  9. VS2019使用NASM编译汇编文件

    注意下面第一个方法用到的配置文件只能编译win32格式的汇编,要是有其他需求自己改配置文件 @1: 下载nasm后安装,在环境变量path中添加其安装目录,下载地址http://www.nasm.us ...

最新文章

  1. python-装饰器实现pv-uv
  2. 用flask部署模型
  3. log4j日志 linux配置,Log4j 日志详细用法
  4. 网易邮箱大师如何定时发送 定时发送邮件方法步骤详解
  5. 【python基础知识】对文本数据库的一些基本操作
  6. micropython中文社区 socket通讯_基于micropython的TCP客户端编程
  7. super(XXXX,self).__init__()在类中的作用
  8. 程序员面试被问到“三次握手,四次挥手”怎么办?
  9. 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)...
  10. [转贴]彻底解决 CrystalReports 登录失败问题。
  11. 同台同时多开DELPHI2007的解决办法
  12. 苹果app代码行数统计
  13. 计算机网络实验二局域网络搭建,计算机网络实验二简单共享局域网组建.doc
  14. ipadpro画流程图_Paper 推出适用于快速制作流程图的 Think 套件
  15. Rust学习教程30 - Panic原理剖析
  16. php redis 传递闭包,有向图传递闭包 - osc_wff1160a的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. 狗哥历经四个小时整理大佬的内容,你确定不来看一下?
  18. svg模糊图片局部清晰透视图
  19. Object.assign()用法小结
  20. Penny Pinching在云中:Azure网站何时有意义?

热门文章

  1. arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap
  2. 工业4.0时代,工业交换机在智能电网建设中有什么作用?
  3. 网络光端机产品特点及实际应用范围详解
  4. 视频光端机维护三大步骤
  5. 【渝粤教育】广东开放大学 行政管理 形成性考核 (35)
  6. 【渝粤题库】陕西师范大学700004 植物生理学
  7. html纵向滚动特效,带视觉差效果的垂直全屏整页滚动特效
  8. 西门子实数转整数_西门子PLC指令全都翻译过来了!
  9. matlab处理svm的数据,SVM-GUI 使用支持向量机(SVM)算法进行处理数据,提取特征参数,并通过MATLAB界面显示相关数 238万源代码下载- www.pudn.com...
  10. linux做定时数据库备份,Linux实现定时备份数据库