天天看点

转载: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​

​​里。注意输出操作数要使用”​

​=​

​“。

继续阅读