内联汇编是在C中直接使用汇编语句进行编程,使程序可以在C中实现C语言不能完成的工作。
下面几种常见的需要使用内联汇编的程序:
- 在程序中使用饱和算术运算(Saturating Arithmetic)
- 程序中要对协处理器进行操作
- 在C程序中完成对程序状态寄存器的操作
内联汇编格式
_asm_ _volatile_("asm code" :output :input :changed registers);
-
asm或者_asm_开头,括号内容写汇编指令
-
asm code 填写汇编代码,指令 + \n\t用双引号引上
"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) "constraint"用于定义variable的存放位置 r 表示使用任何可用的寄存器(立即数和变量都可以) m 表示使用变量的内存地址 i 表示使用立即数
注意事项
arm汇编为例
- 例1:无参数,无返回值,这种情况,output intput 可以省略
asm
(
"mrs r0,cpsr \n\t"
"bic r0,r0,#0x80 \n\t"
"msr cpsr,r0 \n\t"
);
- 例2:让内联汇编做加法运算,求a+b,结果放在sum中,a-b放在d中(op1用来指代)
asm volatile
(
"add %[op1],%[op2],%[op3] \n\t"
"sub %[op4],%[op2],%[op3] \n\t"
:[op1]"=r"(sum),[op4]"=r"(d)
:[op2]"r"(a),[op3]"r"(b)
:"memory"
);