您的位置:首页 > 编程语言 > C语言/C++

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

2013-03-08 20:33 429 查看
intmain(intargc,char**argv) { return1; }g++-Stest.cpp生成test.s汇编文件.file"null-test.cpp" .text .globl main .type main,@function main: .LFB0: .cfi_startprocpushq %rbp .cfi_def_cfa_offset16 .cfi_offset6,-16 movq %rsp,%rbp .cfi_def_cfa_register6 movl %edi,-4(%rbp) movq %rsi,-16(%rbp) movl $1,%eax popq %rbp .cfi_def_cfa7,8ret .cfi_endproc//在函数结束的时候使用与.cfi_startproc相配套使用 .LFE0: .size main,.-main .ident "GCC:(Ubuntu/Linaro4.6.3-1ubuntu5)4.6.3" .section .note.GNU-stack,"",@progbits  看到上面有一些语句如cfi_def_cfacfi_endproccfi_startproc的命令,这些前面都有个关键字cfi它是CallFrameinfromation的意思。                                      查看堆栈的信息CFA是什么意思就不太清楚了可能是controlflowanalysis的意思吧?
.cfi_startproc用在每个函数的开始,用于初始化一些内部数据结构
.cfi_endproc在函数结束的时候使用与.cfi_startproc相配套使用
.cfi_def_cfa_offset16
.cfi_def_cfa_offsetoffset .cfi_def_cfa_offsetmodifiesaruleforcomputingCFA.Registerremainsthesame,butoffsetisnew.NotethatitistheabsoluteoffsetthatwillbeaddedtoadefinedregistertocomputeCFAaddress.
.cfi_def_cfa7,8
.cfi_def_cfaregister,offset    .cfi_def_cfadefinesaruleforcomputingCFAas:takeaddressfromregisterandaddoffsettoit.
.cfi_def_cfa_register6.cfi_def_cfa_registerregister.cfi_def_cfa_registermodifiesaruleforcomputingCFA.Fromnowonregisterwillbeusedinsteadoftheoldone.Offsetremainsthesame.
.cfi_offset6,-16.cfi_offsetregister,offsetPreviousvalueofregisterissavedatoffsetoffsetfromCFA.
.cfi_startproc和.cfi_endproc分别是dwarf2CFI的初始过程和结束过程指令,它们隐藏了一些CFI有关的操作。ret是从当前过程中返回的指令。这就是一个最简单的main函数内部的三个步骤:CFI初始操作–返回–CFI结束操作。由于第一个和最后一个步骤永远伴随着函数,我们大可将注意力集中在这两个步骤之间的代码,也就是main函数的实际内容。eax是一个通用的寄存器,根据cdesl调用约定(即C语言调用约定),在函数返回时,返回值必须保存在eax寄存器中,交给调用者处理。
rbp寄存器是ebp寄存器64位扩展,ebp寄存器扩展基址指针寄存器(extendedbasepointer)  其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。BP
为基指针(BasePointer)寄存器,用它可直接存取堆栈中的数据,它的作用是在调用函数时保存ESP使函数结束时可以正确返回;加E(enhance)代表增强型寄存器,用于32位数据处理。
EAX也是一种32位通用寄存器。EAX寄存器称为累加器,AX寄存器是算术运算的主要寄存器,所有的输入、输出只使用AL或AX人作为数据寄存器。在80386及其以上的微处理器中,EAX寄存器可以用来存储单元的偏移地址。将数据33221100H传送到EAX寄存器的指令EAX可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位进行访问。它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。
.file
,
.text
,etcareassemblerdirectives.
.LFB0
,
.LFE0
arelocallabels,whicharenormallyusedasbranchdestinationswithinafunction.

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航