1 / 13
文档名称:

ARM GCC 内嵌汇编手册.doc

格式:doc   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

ARM GCC 内嵌汇编手册.doc

上传人:xxj16588 2016/4/29 文件大小:0 KB

下载得到文件列表

ARM GCC 内嵌汇编手册.doc

相关文档

文档介绍

文档介绍:转自: http://blogold./u2/69404/ ARM GCC 内嵌( inline )汇编手册关于这篇文档这篇文章是本人为方便各位业界同仁而翻译,方便大家开发底层代码使用,转载请注明出处,谢谢。要是你 E文功底好,本人还是建议阅读 E文版的。/documents/arm-inline- 对于基于 ARM 的RISC 处理器, GNU C编译器提供了在 C代码中内嵌汇编的功能。这种非常酷的特性提供了 C 代码没有的功能,比如手动优化软件关键部分的代码、使用相关的处理器指令。这里设想了读者是熟练编写ARM汇编程序读者,因为该片文档不是ARM汇编手册。同样也不是 C语言手册。这篇文档假设使用的是 GCC 4的版本,但是对于早期的版本也有效。 GCC asm 声明让我们以一个简单的例子开始。就像 C中的声明一样,下面的声明代码可能出现在你的代码中。/* NOP 例子*/ asm ( "mov r0,r0" ); 该语句的作用是将 r0移动到 r0 中。换句话讲他并不干任何事。典型的就是 NO P 指令,作用就是短时的延时。请接着阅读和学****这篇文档,因为该声明并不像你想象的和其他的 C语句一样。内嵌汇编使用汇编指令就像在纯汇编程序中使用的方法一样。可以在一个 asm声明中写多个汇编指令。但是为了增加程序的可读性,最好将每一个汇编指令单独放一行。 asm ( "mov r0, r0\n\t" "mov r0, r0\n\t" "mov r0, r0\n\t" "mov r0, r0" ); 换行符和制表符的使用可以使得指令列表看起来变得美观。你第一次看起来可能有点怪异,但是当 C编译器编译 C语句的是候,它就是按照上面(换行和制表) 生成汇编的。到目前为止,汇编指令和你写的纯汇编程序中的代码没什么区别。但是对比其它的 C声明, asm 的常量和寄存器的处理是不一样的。通用的内嵌汇编模版是这样的。 asm ( code : output operand list : input operand list : clobber list ); 汇编和 C 语句这间的联系是通过上面 asm 声明中可选的 output operand list 和 input operand list 。 Clobber list 后面再讲。下面是将 C 语言的一个整型变量传递给汇编,逻辑左移一位后在传递给 C 语言的另外一个整型变量。/* Rotating bits example */ asm ( "mov %[result], %[value], ror #1" :[ result ] "=r" (y): [ value ] "r" (x )); 每一个 asm 语句被冒号( :)分成了四个部分。?汇编指令放在第一部分中的“”中间。"mov %[result], %[value], ror #1" ?接下来是冒号后的可选择的 output operand list ,每一个条目是由一对[] (方括号)和被他包括的符号名组成,它后面跟着限制性字符串,再后面是圆括号和它括着的 C变量。这个例子中只有一个条目。[ result ] "=r" (y) ?接着冒号后面是输入操作符列表,它的语法和输入操作列表一样[ value ] "r" (x)?破坏符列表,在本例中没有使用就像上面的 NOP 例子, asm 声明的 4个部分中, 只要最尾部没有使用的部分都可以省略。但是有有一点要注意的是,上面的 4 个部分中只要后面的还要使用,前面的部分没有使用也不能省略,必须空但是保留冒号。下面的一个例子就是设置 ARM Soc 的 CPSR 寄存器,它有 input 但是没有 output operand 。 asm ( "msr cpsr,%[ps]" ::[ ps] "r" ( status )) 即使汇编代码没有使用,代码部分也要保留空字符串。下面的例子使用了一个特别的破坏符,目的就是告诉编译器内存被修改过了。这里的破坏符在下面的优化部分在讲解。 asm ( "" ::: "memory" ); 为了增加代码的可读性,你可以使用换行,空格,还有 C风格的注释。 asm ( "mov %[result], %[value], ror #1" :[ result ] "=r" (y)/* Rotation result . */ :[ value ] "r" (x)/* Rotated value . */ :/* No clobbers */ ); 在代码部分%后面跟着的是后面两个部分方括号中的符号,它指的是相同符号操作列表中的一个条目。%[result] 表示第二部分的 C变量 y, %[value] 表