首页 理论教育ARM嵌入式系统中的C程序内联汇编技术

ARM嵌入式系统中的C程序内联汇编技术

【摘要】:内联汇编器使用汇编器说明符进行调用,后面跟用大括号或括号括起来的汇编器指令序列。以使用“__asm”为例,介绍单行和多行内联汇编。下面的例子显示了内联汇编和真正汇编的区别。嵌入汇编函数语法格式如下:在参数列表中允许使用参数名,但不能用在嵌入式汇编函数体内。

1.内联汇编(inline assembly)

内联汇编使用“__asm”(C和C++使用,注意,asm前2个下画线)和“asm”(C++使用)关键字声明。在任何语句位置,都可以使用__asm或asm。内联汇编器使用汇编器说明符进行调用,后面跟用大括号或括号括起来的汇编器指令序列。以使用“__asm”为例,介绍单行和多行内联汇编。

在单行中,示例如下:

由于内联汇编在C或C++程序中,所以在用法上有其自身的一些特点。

●如果同一行中包含多条指令,则用分号“;”隔开。如果使用双引号,则必须将所有指令包含在一对双引号“""”内。

●如果一条指令不能在一行中完成,使用反斜杠“\”将其连接。

●对于多行格式,可以在内联汇编语言块中的任何位置使用C或C++注释。但当一行中包含多个指令时,不能嵌入注释(即注释不能出现在两条指令中间)。

●汇编语言中使用逗号“,”作为指令操作数的分隔符,因此使用逗号运算符的C表达式必须用圆括号括起来。如:(www.chuimin.cn)

●内联汇编语言中的寄存器名被编译器视为C或C++语言中的变量,所以,内联汇编中出现的寄存器名不一定和同名的物理寄存器相对应。这些寄存器名在使用前必须声明。

●内联汇编中的寄存器(CPSR和SPSR除外)在读取前必须先赋值,否则编译器将产生错误信息。

下面的例子显示了内联汇编和真正汇编的区别。

2.嵌入汇编(embedded assembly)

利用ARM编译器可将汇编代码包括到一个或多个C或C++函数定义中去。嵌入汇编函数定义由__asm或asm函数限定符标记。嵌入汇编函数语法格式如下:

在参数列表中允许使用参数名,但不能用在嵌入式汇编函数体内。例如,以下函数在函数体内使用整数i,但在汇编中无效。可以使用R0代替i(根据参数的传递规则)。

下面通过嵌入式汇编的例子,来进一步熟悉嵌入式汇编的使用。下面的例子实现了字符串的复制,注意和上一节中内联汇编中字符串复制的例子相比较,分析其中的区别。