C可以实现应用层的逻辑,但无法控制CPU的工作状态,控制CPU的操作就要通过汇编来完成。比如开发板内的启动程序是汇编,但应用层逻辑执行是C。开发板刚上电的时候,一开始是处于SVC模式,准备就绪后会转换成USER模式,这一步是由汇编完成的,这之后就开始执行C代码。
因为C使用起来更加便利,在使用时,还是以C为主,汇编为辅。
1、C 调用汇编
(1) 外部调用
外部调用指的是执行某个 .s文件中的汇编代码。C中只有函数的概念,汇编中最接近函数的,就是标号了,所以C调用汇编,其实就是把汇编中的标号当作函数处理。
汇编代码:
.global FUNC_ASM @ 需要设为全局,不然C找不到
FUNC_ASM: @ C调用完汇编以后会自动跳回去
MOV R1, #1
MOV R2, #2
C代码:
void myfunc(){
FUNC_ASM();
}
(2) 内联调用
内联调用就是直接在 .c 文件里写汇编代码(需要按照格式来)
内联调用的格式:
asm(
"指令1 \n" // 不要忘记 \n
"指令2 \n"
);
具体使用:
void myfunc(){
asm(
"MOV R1, #1\n"
"MOV R2, #2\n"
);
}
2、汇编调用C
和上面相反,汇编调用C,其实就是把C中的函数当作标号处理。
C代码:
void myfunc(){
int a = 1;
}
汇编代码:
BL myfunc @ 跳转到C函数执行完毕以后,会自己跳转到下一条指令的位置