分析.cpp文件编译生成的汇编文件里语句的作用
1
2
3
4
|
int main( int argc, char ** argv)
{
return 1;
}
|
1
|
g++ -S test .cpp
|
生成test.s汇编文件
.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
12.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
12.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
12.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
123.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文件编译生成的汇编文件里语句的作用相关推荐
- VSCode将Java文件编译生成的class文件存在哪的?
记录一下,有问题欢迎指正^_^ 默认存储在: C:\Users{your_name}\AppData\Roaming\Code\User\workspaceStorage 这个文件夹下会创建项目对应的 ...
- 服务器里解压缩gz文件夹,Shell命令文件压缩解压缩之gzip、zip的案例分析
Shell命令文件压缩解压缩之gzip.zip的案例分析 发布时间:2020-11-13 10:32:36 来源:亿速云 阅读:114 作者:小新 小编给大家分享一下Shell命令文件压缩解压缩之gz ...
- .CS文件编译生成.DLL文件 .EXE文件(C#网络搜集)(转)
如果没有VS用下面的办法 搜索csc.exe 打开cmd 转到csc.exe的文件夹 运行 csc /t:library N:\NET\cs\*.cs N:\NET\cs\*.cs 是你的cs文 ...
- CM3启动汇编文件详解
转载地址:http://www.360doc.com/content/18/0502/16/496343_750516698.shtml 一.启动文件解析 启动文件由汇编编写,是系统上电复位后第一个执 ...
- .CS文件编译生成.DLL文件 .EXE文件
如果没有VS用下面的办法 搜索csc.exe 打开cmd 转到csc.exe的文件夹 运行 csc /t:library N:\NET\cs\*.cs N:\NET\cs\*.cs 是你的cs文 ...
- 用ATL创建COM组件(详细分析了ATL创建的各种文件的意义,看完之后ATL就入门了)
转载自: http://www.cppblog.com/ice197983/articles/4178.html 其他不错的资源: http://technet.microsoft.com/zh ...
- PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段
MS 2.0节是PE文件格式中第一个"节".其大致结构如下:(转载请指明来源于breaksoftware的csdn博客) 在VC\PlatformSDK\Include\WinNT ...
- java 源码分析_Java 源代码编译成 Class 文件的过程分析
原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...
- VS2019使用NASM编译汇编文件
注意下面第一个方法用到的配置文件只能编译win32格式的汇编,要是有其他需求自己改配置文件 @1: 下载nasm后安装,在环境变量path中添加其安装目录,下载地址http://www.nasm.us ...
最新文章
- python-装饰器实现pv-uv
- 用flask部署模型
- log4j日志 linux配置,Log4j 日志详细用法
- 网易邮箱大师如何定时发送 定时发送邮件方法步骤详解
- 【python基础知识】对文本数据库的一些基本操作
- micropython中文社区 socket通讯_基于micropython的TCP客户端编程
- super(XXXX,self).__init__()在类中的作用
- 程序员面试被问到“三次握手,四次挥手”怎么办?
- 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)...
- [转贴]彻底解决 CrystalReports 登录失败问题。
- 同台同时多开DELPHI2007的解决办法
- 苹果app代码行数统计
- 计算机网络实验二局域网络搭建,计算机网络实验二简单共享局域网组建.doc
- ipadpro画流程图_Paper 推出适用于快速制作流程图的 Think 套件
- Rust学习教程30 - Panic原理剖析
- php redis 传递闭包,有向图传递闭包 - osc_wff1160a的个人空间 - OSCHINA - 中文开源技术交流社区...
- 狗哥历经四个小时整理大佬的内容,你确定不来看一下?
- svg模糊图片局部清晰透视图
- Object.assign()用法小结
- Penny Pinching在云中:Azure网站何时有意义?
热门文章
- arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap
- 工业4.0时代,工业交换机在智能电网建设中有什么作用?
- 网络光端机产品特点及实际应用范围详解
- 视频光端机维护三大步骤
- 【渝粤教育】广东开放大学 行政管理 形成性考核 (35)
- 【渝粤题库】陕西师范大学700004 植物生理学
- html纵向滚动特效,带视觉差效果的垂直全屏整页滚动特效
- 西门子实数转整数_西门子PLC指令全都翻译过来了!
- matlab处理svm的数据,SVM-GUI 使用支持向量机(SVM)算法进行处理数据,提取特征参数,并通过MATLAB界面显示相关数 238万源代码下载- www.pudn.com...
- linux做定时数据库备份,Linux实现定时备份数据库