From: http://alpha-blog.wanglianghome.org/2011/04/07/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。