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


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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli3.0使用及配置(部分)

好长一段时间没有关注vue脚手架了,昨天因为需要个后台模板,用脚手架 搞了一下,竟然发现指令不能用了,看官方文档已经升级3.0,也是试的玩了一下, 大致写写怎么玩的!12341.先全局安装vue-cli3.0 …

centos arm-linux-gcc,CentOS 6.4配置arm-linux-gcc交叉环境

首先解压arm-linux-gcc到制定文件夹[armacer ~]$ sudo tar xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /opt/tool/配置环境变量:[armacer ~]$ sudo vi /etc/profile添加:PATH/opt/tool/gcc-3.4.5-glibc-2.3.6/bin:$PATHexport PATH保存退出。执行[armacer ~]$…

使用JavaSymbolSolver解决Java代码中的方法调用

为什么创建java-symbol-solver? 几年前,我开始使用JavaParser ,然后开始做出贡献。 不久之后,我意识到我们想对Java代码执行的许多操作不能仅通过使用解析器生成的抽象语法树来完成,我们还需要解析类型,符号…

kali2.0安装搜狗输入法

其实方法应该是是通用的 (一开始源要配置好: 修改软件源APT-sources.list [python] view plaincopy vim /etc/apt/sources.list 将原来的注释掉,加了个阿里的#阿里云kali源deb http://mirrors.aliyun.com/kali sana main non-free contrib…

linux+vim+动不了,linux的vim按了ctrl+s之后假死的解决办法

Aqua Data Studio中文乱码使用Aqua Data Studio 查询数据时,如果表中的数据有中文时,会显示乱码,如下图: 解决方法很简单,只能更改字体即可,步骤如下: 更改字体后,显示的结果如下:C#调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较1. 测试环境 1.1. 硬件环境…

aix linux操作系统,AIX--操作系统安装(AIX 6.1)

前一段时间,胡哥我接到老板的任务,要在AIX系统上安装zabbix agent呀。可是胡哥只是玩过linux对于AIX这种需要硬件支持的才能玩的高端玩意可是从来没接触过呀,虽说linux是类unix,可是与unix系统还是有区别。有啥办法了,…

秋季学习总结

经过这个学期的学习让我对软件工程这个专业有了新的认识,从c语言的学习中,让我慢慢懂得了如何去编写一个程序,但是编写一个程序也并不是那么的容易。在这个学期的学期中我总是感觉容易忘记上一节课所讲的东西,这个是课后自己没花时…

permgen_打破PermGen神话

permgen在我的最新文章中,我解释了可能导致java.lang.OutOfMemoryError:PermGen空间崩溃的原因 。 现在该讨论该问题的可能解决方案了。 或更确切地说,是关于互联网对可能解决方案的建议。 不幸的是,我只能说,当我通过…

到底是32位系统运行快还是64位系统快

首先声明一下,这个标题“到底是32位系统运行快还是64位系统运行快”的提法本身就是存在问题的,主要是由于很多网友把这个问题提炼的层次太高,那就是“我现在的机子是装32位系统快还是64位系统更快?”,所以就拿这个问题…

linux系统证书存储,Linux系统下如何配置Nginx的SSL安全证书

刚刚介绍了ownCloud的安装,有朋友问我SSL是怎么配置的,哎,为什么不去官方找,却来找我要呢,好吧,我知道你懒得看那些英文,我就介绍一下我是怎么一步步在Nginx上配置SSL的吧。首先你要确保你安装了…

命令界面:使用Java中的动态API处理Redis

Redis是一个数据存储,支持190多个已记录命令和450多个命令排列。 社区积极支持Redis开发; 每个主要的Redis版本都附带新命令。 今年,Redis向第三方供应商开放,以开发可扩展Redis功能的模块。 对于客户端开发人员和Redis用户而言&a…

Python数据库连接池DBUtils

DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: PersistentDB :提供线程专用的数据库连接,并自动管理连接。 PooledDB :提供线程间可共享的数据库连接&…

够用的 Python 写日志的知识——标准日志模块logging简介

前一段工作的时候用到了python写后台系统,需要把一些系统的行为记录下来。本着不要去重复发明轮子的精神,就去搜索了一下python的系统库本身是否有写日志的模块。果然有。python语言作为一门接口简单,标准库强大的语言,果然没有令…

vivox7刷linux系统,Vivo 找来宋仲基帮你送 X7

虽说有极致的 Xplay5 用来打品牌,但真正跑起量来,Vivo 实际上靠得还是以明星代言、外型、自拍等特性为卖点的中端产品线。这不,他们刚刚又在北京发布了全新的 X7 系列,这次找来了大势韩星宋仲基,美其名曰「有了你就有了…

Gradle配置

配置远程仓库 在gradle目录下的init.d目录中创建名为init.gradle文件,内容如下: allprojects{repositories {def REPOSITORY_URL http://localhost:8081/nexus/content/groups/public/all { ArtifactRepository repo ->if(repo instanceof MavenArti…

UML类图实例

首先是复习一下UML中九种图的理解:http://xhf123456789plain.blog.163.com/blog/static/172880482201192222144421/ 画用例图:http://xhf123456789plain.blog.163.com/blog/static/172880482201192221826110/ 下面是类图的实例(好像大话设计中…

836c语言程序设计,2017年辽宁师范大学计算机应用研究所836C语言程序设计考研强化模拟题...

一、选择题1. 以下叙述中正确的是( )。A. 在scanf 函数的格式串中,必须有与输入项一一对应的格式转换说明符B. 只能在printf 函数中指定输入数据的宽度,而不能在scanf 函数中指定输入数据占的宽度C.scanf 函数中的字符串是提示程序员的&#…

days to_days_Java2Days 2012:Java EE

days to_daysJava2Days会议是东欧的主要活动,目的是介绍Java开发的最新趋势。 今年,该活动于10月25日至26日在保加利亚的索非亚举行。 我在那里,并有机会与一些来自SAP的同事一起品尝了一些最新的Java,云和移动内容,这…

c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...

C中静态成员函数与静态成员变量(static )这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C知识记不清楚了,它可以帮你很快回忆起来。复习C语言的static关键字(1)加在…

JVM简单学习

jvm与字节码 jvm只需关注字节码文件 jvm由哪些部分构成 1.类加载子系统,将磁盘中的字节码文件加载到方法区的内存空间中 类加载器分两种:引导类加载器是jvm底层中用C和C语言写的 各个默认的类加载器的不同区别在于 各自默认负责要加载的类的目录不一…