在C语言中内嵌汇编语言

在C语言中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过其使用与汇编文件中的指令有些不同,存在一些限制,主要有以下几个方面:

(1)不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令;

(2)在使用物理寄存器时,不要使用过于复杂的C语言表达式,避免物理寄存器冲突;

(3)R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0~R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器;

(4)一般不要直接指定物理寄存器,而让编译器进行分配。

内嵌汇编语言使用的标记是 _asm或者asm关键字,用法如下:

_asm
{
	instruction [; instruction]…
	[instruction]
}

这里一个例子:

#include 

int main(void)
{
	const char *src="Hello world!";
	char a[20];
	char *dst = a;
	int ch;
	_asm
	{
	loop:
		  LDRB ch,[src],#1
		  STRB ch,[dst],#1
		  CMP ch,#0
		  BNE loop
	}
  
	return 0;
}

几个注意点:

① 内嵌汇编语言中不能直接向PC寄存器赋值。

② 内嵌汇编指令中不要将R12~R14,R0~R3指定为指令中的物理寄存器,因为这些寄存器可能会存放中间结果或用于子程序调用;通常,内嵌汇编指令中不要指定物理寄存器。

③ 内嵌汇编语言中,常量前面的“#”可以省略。

④ C语言程序中的标号可以被内嵌汇编指令使用,但指令BL不能使用C语言的标号(B指令则可以);

⑤ 编译C语言内嵌汇编语言时使用了“内嵌汇编器”,它与armasm汇编器有一些差异,可查阅手册了解。

你可能感兴趣的:(#,ARM体系结构与编程,c语言,汇编,ARM,嵌入式,arm开发)