GCC Inline ASM

在使用高级语言编写程序的时候,可以根据需要插入汇编程序,无须另外创建汇编文件。

在编写inline asm程序时,需要使用asm关键字,并将汇编程序用括号括起来,以分号结尾。格式如下:

asm(code : output operand list : input operand list : clobber list);

如果最右侧的部分为空,可以联通相邻的冒号一起省略。最简单的形式是只有指令部分,如:

asm("mov r0,r0");

复杂的形式则需要提供参数列表,GCC支持两种方式标注汇编指令参数,老的方式是使用数字,如%0便是第0个操作数,%1表示第一个操作数,以此类推;新的方式支持变量名,如%[result]或者$[value],这个名字和高级语言里面的变量没有任何关系。例子如下:

asm("vmsr fpscr,%[value]" : : [value] "r" (var));

或者

asm("vmsr fpscr, %0" : : "r" (var));

VMSR是ARM的一条VFP指令,上述汇编指令的意图是将变量var的值保存到FPSCR状态寄存器里面。由于改指令没有输出操作数,所以输出操作数部分为空,但是相应的冒号要保留。下面的例子则只有输出操作数,没有输入操作数和clobber list,在这种情况下,相应的冒号也可以省略。

asm("vmrs %[result], fpscr" : "=r" (var));

或者

asm("vmrs %0, fpscr" : "=r" (var));

VMRS指令将状态寄存器FPSCR的值保存到变量var里。注意输出操作数要使用”=“。

更多inline asm的知识,参见ARM GCC Inline Assembler Cookbook