内联汇编:嵌入c语言程序的汇编程序
示例:
int add(int a,int b)
{
int sum;
__asm__ volatile(
"add %0,%1,%2"
:"=r"(sum)
:"r"(a),"r"(b)
:"cc"
);
return sum;
}
说明:
__asm__ 为内联汇编的声明
"add %0,%1,%2"
%0 代表第0个操作数
%1 代表第1个操作数
%2 代表第2个操作数
即把第一个操作数加上第二个操作数的和放入第零个操作数
:"=r"(sum)
其中的 : 表示输出,"r"(sum)称为输出操作数 是第0个操作数
=r表示寄存器会被写入某一个值
:"r"(a),"r"(b)
其中的 : 表示输入,"r"(a),"r"(b) 称为输出操作数 。r代表的是寄存器,a放入某个寄存器
"r"(a)是第1个操作数,"r"(b)是第2个操作数
:"cc" 表示汇编代码修改的内容,影响到了flag寄存器
值得注意的是在gcc编译器中常常会进行优化
例如:
“add %0,%1,%2”
这会优化成
add r0,r1
减少使用的内存,但是容易造成bug
所以我们需要将这一句汇编指令中加&
:"=&r"(sum)
可以是汇编指令变为:
ADD R0,R1,R2
即R0=R1+R2
意思就是让一个萝卜占一个坑,不让编译器使重复使用萝卜坑,防止错误。