- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
GCC内嵌汇编.txt24生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如山,宽容为径,循径登山,方知山之高大;生活如歌,宽容是曲,和曲而歌,方知歌之动听。 内核代码绝大部分使用C语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计。
一、基本内嵌汇编
GCC提供了很好的内嵌汇编支持,最基本的格式是:
__asm__ __volatile__(汇编语句模板);
1、__asm__
__asm__是GCC关键字asm的宏定义:
#define __asm__ asm
__asm__或asm用来声明一个内嵌汇编表达式,所以任何一个内嵌汇编表达式都是以它开头的,是必不可少的。
2、汇编语句模板
“汇编语句模板”是一组插入到C程序中的汇编指令(可以是单个指令,也可以是一组指令)。每条指令都应该由双引号括起,或者整组指令应该由双引号括起。每条指令还应该用一个定界符结尾。有效的定界符为换行符(\n)和分号(;)。\n后可以跟一个制表符(\t)作为格式化符号,增加GCC在汇编文件中生成的指令的可读性。
上述原则可以归结为:
①任意两个指令间要么被分号(;)分开,要么被放在两行;
②放在两行的方法既可以通过\n的方法来实现,也可以真正的放在两行;
③可以使用一对或多对双引号,每对双引号里可以放任意多条指令,所有的指令都必须放到双引号中。
在基本内嵌汇编中,“汇编语句模板”的书写的格式和你直接在汇编文件中使用汇编语言编程没有什么不同,你可以在其中定义标号(Label),定义对齐(.align n),定义段(.section name)。例如:
__asm__(.align 2\n\t
movl %eax, %ebx\n\t
test %ebx, %ecx\n\t
jne error\n\t
sti\n\t
error: popl %edi\n\t
subl %ecx, %ebx);
建议大家都使用这种格式来写内嵌汇编代码。
3、__volatile__
__volatile__是GCC关键字volatile的宏定义:
#define __volatile__ volatile
__volatile__或volatile是可选的。如果不想让GCC的优化改动你的内嵌汇编代码,你最好在前面都加上__volatile__。
二、带C语言表达式的内嵌汇编
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可,GCC会自动插入代码完成必要的操作。
通常嵌入到C代码中的汇编语句很难做到与其它部分没有任何关系,因此更多时候需要用到扩展的内嵌汇编格式:
__asm__ __volatile__(汇编语句模板 : 输出部分 : 输入部分 : 破坏描述部分);
内嵌汇编表达式包含4个部分,各部分由“:”分隔。这4个部分都不是必须的,任何一个部分都可以为空,其规则为:
①如果“破坏描述部分”为空,则其前面的“:”必须省略。比如:
__asm__(mov %%eax, %%ebx : :);。
②如果“汇编语句模板”为空,则“输出部分”,“输入部分”以及“破坏描述部分”可以不为空,也可以为空。比如:
__asm__( : : : memory);。
③如果“输出部分”,“输入部分”以及“破坏描述部分”都为空,“输出部分”和“输入部分”之前的“:”既可以省略,也可以不省略。如果都省略,则此汇编退化为一个基本内嵌汇编,否则,仍然是一个带有C语言表达式的内嵌汇编。
④如果“输入部分”和“破坏描述部分”为空,但“输出部分”不为空,“输入部分”前的“:”既可以省略,也可以不省略。
⑤如果后面的部分不为空,而前面的部分为空,则前面的“:”都必须保留,否则无法说明不为空的部分究竟是第几部分。
⑥如果“破坏描述部分”不为空,而“输出部分”和“输入部分”都为空,则“输出部分”和“输入部分”前的“:”都必须保留。
从上面的规则可以看到另外一个事实,区分一个内嵌汇编是基本格式的还是扩展格式的,其规则在于在“汇编语句模板”后面是否有“:”的存在,如果没有则是基本格式的,否则,就是扩展格式的。
这两种格式对寄存器语法的要求不同:基本格式要求寄存器前只能使用一个%,这一点和原生汇编相同;而扩展格式则要求寄存器前必须使用两个%%。比如:
__asm__(mov %%eax, %%ebx :)
和
__asm__(mov %eax, %ebx)
都是正确的写法,而
__a
您可能关注的文档
最近下载
- 电力行业电网运行维护员岗面试真题题库参考答案和答题要点.docx VIP
- 健康照护师复习资料试题附答案(500题).docx
- 2型糖尿病医学演示课件.ppt VIP
- 2024新沪教版英语(五·四学制)七年级上单词表 (英译汉).docx VIP
- (2025年版)基孔肯雅热诊疗方案全文PPT课件.ppt
- 浙江绍兴市12345政务热线招录工作人员6人笔试备考题库带答案详解.docx VIP
- 化学丨河北省石家庄市2024届高三下学期3月联考(一模)化学试卷及答案.pdf VIP
- SHT35212007石油化工仪表工程施工技术规程.pdf VIP
- 心力衰竭课件PPT.pptx VIP
- NFPA 72-2022 国家火灾报警和信号代码(中文翻译版).pdf VIP
文档评论(0)