4.2.5 C语言代码中调用汇编函数
C语言中调用汇编函数所涉及的关键点也是参数传递和函数返回问题。
1. 参数传递
在编译时,编译器将会对C函数的实参使用R0~R3进行传递(如果超过四个参数,则其余的参数使用栈进行传递),因此汇编函数可以直接使用R0~R3寄存器进行计算。
2. 函数返回
由于汇编代码是不经过编译器处理的代码,所以现场保护和返回都必须由程序员自己完成。通常情况下现场保护代码就是将本函数内用到的R4~R12寄存器压栈保护,并且将R14寄存器压栈保护,汇编函数返回时将栈中保护的数据弹出。
假设要设计一汇编函数,完成两整数相减(假设必须用R7和R8寄存器完成),并在C函数中调用。设计代码如下:
- ;汇编代码文件
- ;asses.S
- EXPORT sub1 ;声明该函数
- … …
- AREA Init,CODE,READONLY
- ENTRY
- … …
- sub1
- STMFD sp!,{r7-r8,lr};保存现场
- MOV R7,R0 ;通过R0,R1寄存器传送参数
- MOV R8,R1
- SUB R7,R8
- MOV R0,R7
- LDMFD sp!,{r7-r8,pc};返回
- … …
- END
- //C文件
- //main.c
- int sub1(int,int);//函数声明
- … …
- int Main( )
- {
- int x=20,y=10;
- sub1(x,y) ;
- }
- … …
备注:其实在上面例子中可以不用保存LR寄存器,但是如果在此汇编函数中调用其他函数,就必须保存LR寄存器了。