Linux C 嵌入汇编(内联)注意事项

Linux C 嵌入汇编(内联)注意事项

ID:7177994

大小:30.00 KB

页数:2页

时间:2018-02-06

Linux C 嵌入汇编(内联)注意事项_第1页
Linux C 嵌入汇编(内联)注意事项_第2页
资源描述:

《Linux C 嵌入汇编(内联)注意事项》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、LinuxC嵌入汇编(内联)注意事项-修改版一般来讲,在C中内联汇编语句要比纯粹的汇编语言代码复杂的多,需要解决如何分配寄存器、如何与C代码中的变量相结合的问题。在Linux下的arm汇编语法格式不同于ADS下面的汇编语法格式,但是arm的指令都遵从于ARM的规范。在Linux下的C程序里面内联汇编代码,特别需要注意格式的问题。1.从大的方面来讲,内联的汇编代码在C源文件中的区域标识不同。最基本的格式是:__asm__(“asmstatements”);如果是多条汇编指令的话,需要用”t”将它们隔开。如下所示:

2、__asm__(“asmstatementst”“asmstatementst”…“asmstatements”);2.完整的内联汇编代码格式如下:__asm__(“asmstatements”:outputs:inputs:registers-modified);内联的汇编代码语句被”:”分割为4部分;其中,第一部分为汇编代码本身,通常成为指令部,格式与纯汇编代码是相同的。指令部是必须的,其他部分如果没有必要,可以省略。在C中内联汇编,需要处理的一个问题就是如何与C语句中的变量相结合、传入汇编代码、从汇

3、编代码中传出改变的值。在内联汇编代码的指令部中,使用占位符来表示需要使用寄存器的操作数,有几个占位符就表示有几个变量需要和寄存器相结合,汇编器在编译和连接的时候就会相应的根据后面的约束条件进行处理。输出约束和输入约束的格式相同,是这样一种结构:“constraint”(variable)指令部后面紧接著就是输出部,它用来规定输出变量如何与占位符来结合。每一个条件可以成为一个约束,必要的时候可以使用多个约束,相互之间使用逗号隔开。一般情况下,每个输出约束都是以输出修饰符=开始,然后紧跟一个约束代码,最后是相结合的变量名

4、称。如果变量既需要输入又需要输出,那么必须使用修饰符+。紧接着就是输入部,它用来规定仅仅作为输入的变量如何与占位符相结合。它与输入部相似,由于只是输入,所以一般是不用输出修饰符(比如上面提到的=和+)的。有时进行某些操作的时候,可能还会需要多个寄存器来保存中间的结果,这样就难免会破坏原有寄存器的内容。在gcc内联汇编的格式中的最后一部分可以对将产生副作用的寄存器进行说明,以便gcc能够采用相应的措施。3.常见的输入输出修饰符和约束代码介绍约束代码意义r使用任何可用的通用寄存器m使用变量的内存位置g使用任何可用的寄存器

5、和内存位置i使用立即数的值输入输出修饰符意义=只能写入操作数+可读可写操作数&在内联函数完成之前,可以删除或者重新使用操作数4.一个内联汇编的实例#includeintmain(){inta=10,b=0,c=0;__asm____volatile__(“movr0,%2t”“addr0,r0,#5t”“mov%1,r0t”“mov%0,r0”:“=r”(b),“=r”(c):“r”(a));printf(“b=%dc=%d”,b,c);return0;}

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

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

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