gcc中的内嵌汇编语言

gcc中的内嵌汇编语言

ID:11901214

大小:48.50 KB

页数:18页

时间:2018-07-14

gcc中的内嵌汇编语言_第1页
gcc中的内嵌汇编语言_第2页
gcc中的内嵌汇编语言_第3页
gcc中的内嵌汇编语言_第4页
gcc中的内嵌汇编语言_第5页
资源描述:

《gcc中的内嵌汇编语言》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、gcc中的内嵌汇编语言作者:欧阳光ouyangguang@263.net初次接触到AT&T格式的汇编代码,看着那一堆莫名其妙的怪符号,真是有点痛不欲生的感觉,只好慢慢地去啃gcc文档,在似懂非懂的状态下过了一段时间。后来又在网上找到了灵溪写的《gcc中的内嵌汇编语言》一文,读后自感大有裨益。几个月下来,接触的源代码多了以后,慢慢有了一些经验。为了使初次接触AT&T格式的汇编代码的同志不至于遭受我这样的痛苦,就整理出该文来和大家共享.如有错误之处,欢迎大家指正,共同提高.本文主要以举例的方式对gcc中的内嵌汇编语言进行进一步的解释。一、gcc对内嵌汇编语言的处理

2、方式gcc在编译内嵌汇编语言时,采取的步骤如下1.变量输入:根据限定符的内容将输入操作数放入合适的寄存器,如果限定符指定为立即数("I")或内存变量("m"),则该步被省略,如果限定符没有具体指定输入操作数的类型(如常用的"g"),gcc会视需要决定是否将该操作数输入到某个寄存器.这样每个占位符都与某个寄存器,内存变量,或立即数形成了一一对应的关系.这就是对第二个冒号后内容的解释.如::"a"(foo),"I"(100),"m"(bar)表示%0对应eax寄存器,%1对应100,%2对应内存变量bar.2.生成代码:然后根据这种一一对应的关系(还应包括输出操作

3、符),用这些寄存器,内存变量,或立即数来取代汇编代码中的占位符(则有点像宏操作),注意,则一步骤并不检查由这种取代操作所生成的汇编代码是否合法,例如,如果有这样一条指令asm("movl%0,%1"::"m"(foo),"m"(bar));如果你用gcc-c-S选项编译该源文件,那么在生成的汇编文件中,你将会看到生成了movlfoo,bar这样一条指令,这显然是错误的.这个错误在稍后的编译检查中会被发现.3.变量输出:按照输出限定符的指定将寄存器的内容输出到某个内存变量中,如果输出操作数的限定符指定为内存变量("m"),则该步骤被省略.这就是对第一个冒号后内容

4、的解释,如:asm("mov%0,%1":"=m"(foo),"=a"(bar):);编译后为#APPmovlfoo,eax#NO_APPmovleax,bar该语句虽然有点怪怪的,但它很好的体现了gcc的运作方式.          再以arch/i386/kernel/apm.c中的一段代码为例,我们来比较一下它们编译前后的情况源程序编译后的汇编代码__asm__("pushl%%edit""pushl%%ebpt""lcall%%cs:t""setc%%alt""addl%1,%2t""popl%%ebpt""popl

5、%%edit":"=a"(ea),"=b"(eb),"=c"(ec),"=d"(ed),"=S"(es):"a"(eax_in),"b"(ebx_in),"c"(ecx_in):"memory","cc");movleax_in,%eaxmovlebx_in,%ebxmovlecx_in,%ecx#APPpushl%edipushl%ebplcall%cs:setc%aladdleb,ecpopl%ebppopl%edi#NO_APPmovl%eax,eamovl%ebx,ebmovl%ecx,ecmovl%edx,edmovl%esi,es二.对第三个

6、冒号后面内容的解释第三个冒号后面内容主要针对gcc优化处理,它告诉gcc在本段汇编代码中对寄存器和内存的使用情况,以免gcc在优化处理时产生错误.1.它可以是"eax","ebx","ecx"等寄存器名,表示本段汇编代码对该寄存器进行了显式操作,如asm("mov%%eax,%0",:"=r"(foo)::"eax");这样gcc在优化时会避免使用eax作临时变量,或者避免cache到eax的内存变量通过该段汇编码.下面的代码均用gcc的-O2级优化,它显示了嵌入汇编中第三个冒号后"eax"的作用 源程序编译后的汇编代码正常情况下intmain(){intba

7、r=1;bar=fun();bar++;returnbar;}pushl%ebpmovl%esp,%ebpcallfunincl%eax#显然,bar缺省使用eax寄存器leaveret加了汇编后intmain(){intbar=1;bar=fun();asmvolatile("":::"eax");bar++;returnbar;}pushl%ebpmovl%esp,%ebp#建立堆栈框架callfun#fun的返回值放入bar中,此时由于嵌入汇编#指明改变了eax的值,为了避免冲突,#bar改为使用edx寄存器movl%eax,%edx#APP#NO_AP

8、Pincl%edxmovl%edx,%

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。