场景1、c内嵌汇编
$vim main.c
#include <stdio.h>
int main(int argc, char** argv) {
char a,b,c;
a = 1;
b = 2;
/*形式1*/
asm [volatile] { //不同的编译器可能是__asm或__asm__,volatile同理
[汇编代码块]
}
/*形式2*/
asm volatile ("mrc p14, 0, %0, c0, c1, 0" : "=r" (status));
c = a+b;
return 0;
}
注:内嵌汇编的限制
1.汇编程序跳转只能用B或BL指令,不能直接给PC寄存器赋值
2.在使用物理寄存器时不要使用复杂的c表达式,避免寄存器冲突
3.避免直接使用寄存器R0~R3,R12~R14;
因为在计算表达式时,R0~R3,R12,R14可能用于子程序调用;
而R12,R13可能被编译器用来存放中间编译结果。
场景2、c调用汇编
$vim func.s
EXPORT my_func
my_func
[汇编代码块]
$vim main.c
extern cahr my_func(char par1, char par2);
int main(int argc, char** argv) {
char a,b,c;
a = 1;
b = 2;
c = my_func(a, b); //参数将传给寄存器R0~R3或栈
return 0;
}
场景3、汇编调用c
$vim func.c
cahr my_func(char a, char b) {
char c = 0;
c = a + b;
return c;
}
$vim init.s
IMPORT my_func
MOV R0,#1 //传参
MOV R1,#2 //传参
BL my_func //跳转
注:无论是c调用汇编还是汇编调用c,
函数传参默认使用寄存器R0~R3,多于4个的参数使用栈,函数返回值放在寄存器R0