在C语言中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过其使用与汇编文件中的指令有些不同,存在一些限制,主要有以下几个方面:
(1)不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令;
(2)在使用物理寄存器时,不要使用过于复杂的C语言表达式,避免物理寄存器冲突;
(3)R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0~R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器;
(4)一般不要直接指定物理寄存器,而让编译器进行分配。
内嵌汇编语言使用的标记是 _asm或者asm关键字,用法如下:
_asm
{instruction [; instruction]…[instruction]
}
这里一个例子:
#include <stdio.h>int main(void)
{const char *src="Hello world!";char a[20];char *dst = a;int ch;_asm{loop:LDRB ch,[src],#1STRB ch,[dst],#1CMP ch,#0BNE loop}return 0;
}
几个注意点:
① 内嵌汇编语言中不能直接向PC寄存器赋值。
② 内嵌汇编指令中不要将R12~R14,R0~R3指定为指令中的物理寄存器,因为这些寄存器可能会存放中间结果或用于子程序调用;通常,内嵌汇编指令中不要指定物理寄存器。
③ 内嵌汇编语言中,常量前面的“#”可以省略。
④ C语言程序中的标号可以被内嵌汇编指令使用,但指令BL不能使用C语言的标号(B指令则可以);
⑤ 编译C语言内嵌汇编语言时使用了“内嵌汇编器”,它与armasm汇编器有一些差异,可查阅手册了解。