GNU内联汇编
内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编
- 程序中使用饱和算术运算(Saturating Arithmetic)
- 程序需要对协处理器进行操作
- 在C程序中完成对程序状态寄存器的操作
__asm__ __volatile__("asm code":output:input:changed registers);
Note:
- 使用__asm__和__volatile__表示编译器将不检查后面的内容,而是直接交给汇编器。
- 如果希望变压器你优化,__volatile__可以不加
- 没有asm code也不能省略""
- 没有前面的和中间的部分,不可以相应的省略:
- 没有changed 部分,必须相应的省略:
- 最后的;不能省略,对于C语言来说这是一条语句
- 汇编代码必须放在一个字符串内,且字符串中间不能直接按回车换行,可以写成多个字符串,注意中间不能有任何符号,这样就会将两个字符串合并为一个
- 指令之间必须要换行,还可以使用\t使指令在汇编中保持整齐
asm code
"mov r0, r0\n\t" "mov r1,r1\n\t" "mov r2,r2"
output(asm->C)
:"constraint" (variable)
"constraint"用于定义variable的存放位置:
r表示使用任何可用的寄存器
m表示使用变量的内存地址
+可读可写
=只写
&表示该输出操作数不能使用输入部分使用过的寄存器,只能用"+&"或"=&"的方式使用
input(C->asm)
:"constraint" (variable/immediate)
"constraint"用于定义variable的存放位置:
r表示使用任何可用的寄存器(立即数和变量都可以)
m表示使用变量的内存地址
i表示使用立即数
例子
int a=100,b=200; int result;
__asm__ __volatile_
网友评论

