gcc内嵌汇编46667

gcc内嵌汇编46667

ID:19516333

大小:54.00 KB

页数:16页

时间:2018-10-03

gcc内嵌汇编46667_第1页
gcc内嵌汇编46667_第2页
gcc内嵌汇编46667_第3页
gcc内嵌汇编46667_第4页
gcc内嵌汇编46667_第5页
资源描述:

《gcc内嵌汇编46667》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、GCC内嵌汇编46667GCC内嵌汇编.txt24生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如山,宽容为径,循径登山,方知山之高大;生活如歌,宽容是曲,和曲而歌,方知歌之动听。内核代码绝大部分使用C语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计。一、基本内嵌汇编GCC提供了很好的内嵌汇编支持,最基本的格式是:__asm____volatile__(汇编语句模板);1、__asm____asm__

2、是GCC关键字asm的宏定义:#define__asm__asm__asm__或asm用来声明一个内嵌汇编表达式,所以任何一个内嵌汇编表达式都是以它开头的,是必不可少的。2、汇编语句模板“汇编语句模板”是一组插入到C程序中的汇编指令(可以是单个指令,也可以是一组指令)。每条指令都应该由双引号括起,或者整组指令应该由双引号括起。每条指令还应该用一个定界符结尾。有效的定界符为换行符()和分号(;)。后可以跟一个制表符(t)作为格式化符号,增加GCC在汇编文件中生成的指令的可读性。上述原则可以归结为:①任意两个指令间要么被

3、分号(;)分开,要么被放在两行;②放在两行的方法既可以通过的方法来实现,也可以真正的放在两行;③可以使用一对或多对双引号,每对双引号里可以放任意多条指令,所有的指令都必须放到双引号中。在基本内嵌汇编中,“汇编语句模板”的书写的格式和你直接在汇编文件中使用汇编语言编程没有什么不同,你可以在其中定义标号(Label),定义对齐(.alignn),定义段(.sectionname)。例如:__asm__(".align2t""movl%eax,%ebxt""test%ebx,%ecxt""jneerror

4、t""stit""error:popl%edit""subl%ecx,%ebx");建议大家都使用这种格式来写内嵌汇编代码。3、__volatile____volatile__是GCC关键字volatile的宏定义:#define__volatile__volatile__volatile__或volatile是可选的。如果不想让GCC的优化改动你的内嵌汇编代码,你最好在前面都加上__volatile__。二、带C语言表达式的内嵌汇编在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表

5、达式的值读入哪个寄存器,以及如何将计算结果写回C变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可,GCC会自动插入代码完成必要的操作。通常嵌入到C代码中的汇编语句很难做到与其它部分没有任何关系,因此更多时候需要用到扩展的内嵌汇编格式:__asm____volatile__(汇编语句模板:输出部分:输入部分:破坏描述部分);内嵌汇编表达式包含4个部分,各部分由“:”分隔。这4个部分都不是必须的,任何一个部分都可以为空,其规则为:①如果“破坏描述部分”为空,则其前面的“:”必须省略。比如:__asm__("mo

6、v%%eax,%%ebx"::);。②如果“汇编语句模板”为空,则“输出部分”,“输入部分”以及“破坏描述部分”可以不为空,也可以为空。比如:__asm__("":::"memory");。③如果“输出部分”,“输入部分”以及“破坏描述部分”都为空,“输出部分”和“输入部分”之前的“:”既可以省略,也可以不省略。如果都省略,则此汇编退化为一个基本内嵌汇编,否则,仍然是一个带有C语言表达式的内嵌汇编。④如果“输入部分”和“破坏描述部分”为空,但“输出部分”不为空,“输入部分”前的“:”既可以省略,也可以不省略。⑤如果后面的部分不

7、为空,而前面的部分为空,则前面的“:”都必须保留,否则无法说明不为空的部分究竟是第几部分。⑥如果“破坏描述部分”不为空,而“输出部分”和“输入部分”都为空,则“输出部分”和“输入部分”前的“:”都必须保留。从上面的规则可以看到另外一个事实,区分一个内嵌汇编是基本格式的还是扩展格式的,其规则在于在“汇编语句模板”后面是否有“:”的存在,如果没有则是基本格式的,否则,就是扩展格式的。这两种格式对寄存器语法的要求不同:基本格式要求寄存器前只能使用一个%,这一点和原生汇编相同;而扩展格式则要求寄存器前必须使用两个%%。比如:__asm

8、__("mov%%eax,%%ebx":)和__asm__("mov%eax,%ebx")都是正确的写法,而__asm__("mov%eax,%ebx":)和__asm__("mov%%eax,%%ebx")都是错误的写法。任何只带一个“%”的标识符都看成是操作数,而不是寄存

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

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

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