1、内联汇编基本格式
asm("assembly code" /* 汇编代码 */
:output_operand /* 输出参数列表 */
:input_operand /* 输入参数列表 */
:clobbered_operand /* 被改变的操作对象列表 */
);
在被改变的参数列表中有一个比较有用的标识符:memory。指定 memory,相当于对编译器形成了一个内存读写的屏障,保证在内联汇编执行前,编译器将某些寄存器里的值刷新进内存,同时在内联汇编执行后,编译器重新加载相关变量的值。
2、修饰符
每个输入/输出参数前面可能有修饰符
= 只写,常用于修饰所有输出操作数
+ 可读可写
r 可以是任意的通用寄存器存储其值
& 只用于输出,一般和'='一起用,如:"=&r" (val)
3、示例
使用内联汇编计算两个变量的和
int a = 1, b = 2, sum = 0;
asm("add.d %0, %1, %2"
:"=r"(sum)
:"r"(a),"r"(b)
);
参考资料
1. 修饰符:https://gcc.gnu.org/onlinedocs/gcc/Constraints.html#Constraints