William Hohl的ARM汇编语言书介绍了嵌入式汇编语法。可以在ARM参考手册的here上找到它的示例:
#include <stdio.h>
__asm void my_strcpy(const char *src, char *dst)
{
loop
LDRB r2, [r0], #1
STRB r2, [r1], #1
CMP r2, #0
BNE loop
BX lr
}
当我谷歌'gcc嵌入式汇编程序'语法时,我只得到以下results。 gcc是否仅支持所谓的“extended assembly syntax?”
asm [volatile] ( AssemblerTemplate
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])
答案 0 :(得分:1)
否。 GCC 不支持嵌入式汇编函数,如示例中所示。你必须使用例如一个KEIL编译器。
GCC支持的两种内联汇编形式是&#34;简单&#34; (这只是asm
关键字后面跟花括号的变体之一)和更有用的&#34;扩展&#34;这种形式允许您以非常灵活和有效的方式将输入和输出的变量映射到寄存器或寄存器类。您可以编写几乎与寄存器无关的程序集,该程序集可以正常使用编译器的容量进行低级优化(显然它不能进行高级优化,会有点太多!)。
不幸的是,语法有点......起初不直观。
为了获得与嵌入式汇编my_strcpy
函数相同的效果,您必须编写一个包含扩展汇编块的普通函数,并将函数的参数映射到输入(和不要忘记破坏memory
)。
请注意,GCC内联汇编有一些额外的怪癖可能会让人感到意外。首先,它使用AT&amp; T表示法,然后你必须向每一行显式添加\n
以防止汇编程序抱怨(或\n\t
如果你打算检查中间文件并关心可读输出)。
第一个怪癖(AT&amp; T表示法)实际上是一个好处,因为它比英特尔符号更直观,你只需要首先了解它。另一方面,明确添加转义换行符的需求是...... bleh。幸运的是,你并不需要经常使用装配(如果有的话)。