arm_gcc内嵌汇编手册

arm_gcc内嵌汇编手册

ID:12306553

大小:38.85 KB

页数:9页

时间:2018-07-16

arm_gcc内嵌汇编手册_第1页
arm_gcc内嵌汇编手册_第2页
arm_gcc内嵌汇编手册_第3页
arm_gcc内嵌汇编手册_第4页
arm_gcc内嵌汇编手册_第5页
资源描述:

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

1、ARMGCC内嵌(inline)汇编手册关于这篇文档对于基于ARM的RISC处理器,GNUC编译器提供了在C代码中内嵌汇编的功能。这种非常酷的特性提供了C代码没有的功能,比如手动优化软件关键部分的代码、使用相关的处理器指令。这里设想了读者是熟练编写ARM汇编程序读者,因为该片文档不是ARM汇编手册。同样也不是C语言手册。这篇文档假设使用的是GCC4的版本,但是对于早期的版本也有效。GCCasm声明让我们以一个简单的例子开始。就像C中的声明一样,下面的声明代码可能出现在你的代码中。/*NOP例子*

2、/asm("movr0,r0")该语句的作用是将r0移动到r0中。换句话讲他并不干任何事。典型的就是NOP指令,作用就是短时的延时。请接着阅读和学习这篇文档,因为该声明并不像你想象的和其他的C语句一样。内嵌汇编使用汇编指令就像在纯汇编程序中使用的方法一样。可以在一个asm声明中写多个汇编指令。但是为了增加程序的可读性,最好将每一个汇编指令单独放一行。asm("movr0,r0t""movr0,r0t""movr0,r0t""movr0,r0")换行符和制表符的使用可以使得指令列

3、表看起来变得美观。你第一次看起来可能有点怪异,但是当C编译器编译C语句的是候,它就是按照上面(换行和制表)生成汇编的。到目前为止,汇编指令和你写的纯汇编程序中的代码没什么区别。但是对比其它的C声明,asm的常量和寄存器的处理是不一样的。通用的内嵌汇编模版是这样的。asm(code:outputoperandlist:inputoperandlist:clobberlist)汇编和C语句这间的联系是通过上面asm声明中可选的outputoperandlist和inputoperandlist。Cl

4、obberlist后面再讲。下面是将C语言的一个整型变量传递给汇编,逻辑左移一位后在传递给C语言的另外一个整型变量。/*Rotatingbitsexample*/asm("mov%[result],%[value],ror#1":[result]"=r"(y):[value]"r"(x))每一个asm语句被冒号(:)分成了四个部分。l汇编指令放在第一部分中的“”中间。"mov%[result],%[value],ror#1"l接下来是冒号后的可选择的outputoperandlist,每一个条目

5、是由一对[](方括号)和被他包括的符号名组成,它后面跟着限制性字符串,再后面是圆括号和它括着的C变量。这个例子中只有一个条目。[result]"=r"(y)l接着冒号后面是输入操作符列表,它的语法和输入操作列表一样[value]"r"(x)l破坏符列表,在本例中没有使用就像上面的NOP例子,asm声明的4个部分中,只要最尾部没有使用的部分都可以省略。但是有有一点要注意的是,上面的4个部分中只要后面的还要使用,前面的部分没有使用也不能省略,必须空但是保留冒号。下面的一个例子就是设置ARMSoc的C

6、PSR寄存器,它有input但是没有outputoperand。asm("msrcpsr,%[ps]"::[ps]"r"(status))即使汇编代码没有使用,代码部分也要保留空字符串。下面的例子使用了一个特别的破坏符,目的就是告诉编译器内存被修改过了。这里的破坏符在下面的优化部分在讲解。asm("":::"memory")为了增加代码的可读性,你可以使用换行,空格,还有C风格的注释。asm("mov%[result],%[value],ror#1":[result]"=r"(y)/*Rotat

7、ionresult.*/:[value]"r"(x)/*Rotatedvalue.*/:/*Noclobbers*/)在代码部分%后面跟着的是后面两个部分方括号中的符号,它指的是相同符号操作列表中的一个条目。%[result]表示第二部分的C变量y,%[value]表示三部分的C变量x;符号操作符的名字使用了独立的命名空间。这就意味着它使用的是其他的符号表。简单一点就是说你不必关心使用的符号名在C代码中已经使用了。在早期的C代码中,循环移位的例子必须要这么写:asm("mov%0,%1,ror#

8、1":"=r"(result):"r"(value))在汇编代码中操作数的引用使用的是%后面跟一个数字,%1代表第一个操作数,%2代码第二个操作数,往后的类推。这个方法目前最新的编译器还是支持的。但是它不便于维护代码。试想一下,你写了大量的汇编指令的代码,要是你想插入一个操作数,那么你就不得不从新修改操作数编号。优化C代码有两种情况决定了你必须使用汇编。1st,C限制了你更加贴近底层操作硬件,比如,C中没有直接修改程序状态寄存器(PSR)的声明。2nd就是要写出更加优化的代码。毫无疑问GNUC代

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

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

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