ARM_GCC_内嵌汇编手册.pdf

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM_GCC_内嵌汇编手册

转自:/u2/69404/showart_1922655.html ARM GCC 内嵌(inline )汇编手册 关于这篇文档这篇文章是本人为方便各位业界同仁而翻译,方便大家开发底层代码使用, 转载请注明出处,谢谢。要是你 E 文功底好,本人还是建议阅读 E 文版的。 http://www.ethernut.de/en/documents/arm-inline-asm.html 对于基于 ARM 的 RISC 处理器,GNU C 编译器提供了在 C 代码中内嵌汇编的功 能。这种非常酷的特性提供了 C 代码没有的功能,比如手动优化软件关键部分的 代码、使用相关的处理器指令。 这里设想了读者是熟练编写 ARM 汇编程序读者,因为该片文档不是 ARM 汇编 手册。同样也不是 C 语言手册。 这篇文档假设使用的是 GCC 4 的版本,但是对于早期的版本也有效。 GCC asm 声明让我们以一个简单的例子开始。就像 C 中的声明一样,下面的声 明代码可能出现在你的代码中。 /* NOP 例子 */ asm(mov r0,r0); 该语句的作用是将 r0 移动到 r0 中。换句话讲他并不干任何事。典型的就是 NOP 指令,作用就是短时的延时。 请接着阅读和学习这篇文档,因为该声明并不像你想象的和其他的 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 : 每一个 语句被冒号( )分成了四个部分。 l 汇编指令放在第一部分中的“”中间。 mov %[result], %[value], ror #1 l 接下来是冒号后的可选择的 output operand list ,每一个条目是由一对[] (方括号)和被他包括的符号名组成,它后面跟着限制性字符串,再后面是圆 括号和它括着的 C 变量。这个例子中只有一个条目。 [result] =r (y) l 接着冒号后面是输入操作符列表,它的语法和输入操作列表一样 [value] r (x) l 破坏符列表,在本例中没有使用 就像上面的 NOP 例子,asm 声明的 4 个部分中,只要最尾部没有使用的部分都 可以省略。但是有有一点要注意的是,上面的 4 个部分中只要后面的还要使用, 前面的部分没有使用也不能省略,必须空但是保留冒号。下面的一个例子就是设 置ARM Soc 的 CPSR 寄存器,它有 input 但是没有 output operand。 asm(msr cpsr,%[ps] : : [ps]r(status)) 即使汇编代码没有使用,代码部分也要保留空字符串。下面的例子使用了一个特 别的破坏符,目的就是告诉编译器内存被修改过了。这里的破坏符在下面的优化 部分在讲解。 asm(:::memory); 为了增加代码的可读性,你可以使用换行,空格,还有C 风格的注释。 asm(mov %[result],

文档评论(0)

xxj1658888 + 关注
实名认证
内容提供者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档