在汇编中调用C函数

除了汇编语言工程和c语言工程,许多嵌入式工程既包含c语言又包含汇编语言。由于keil mdk的默认启动代码是用汇编编写的,但是又是独立的一个启动代码是汇编实现,一般其他程序都是c语言实现。  
我们一起来看下混合语言工程中,就比如在汇编程序中调用c函数,或者在c语言代码中调用汇编函数需要注意什么,稍不留意结果就可能是无法预测的。比如程序在一种版本的编译器下可以正常工作,而在另外的版本下,或者更换编译器后,工程可能会由于寄存器的使用冲突而停止工作。
在汇编中调用c函数
当在汇编文件中调用c函数的时候,需要注意一下方面:
①寄存器r0到r3、r12以及lr可能会被更改,如果这些寄存器中的数据之后还要使用,就需要将它们保存到栈上。
②sp的值应该是双字对齐的
③需要确保输入参数存储在正确的寄存器中(比如简单例子,使用r0~r3)
④返回值(假定为32位或更小)一般存在r0中
举个例子:如果有一个将四个值相加的函数:
int my_add(int x1,int x2,int x3,int x4){ return (x1+x2+x3+x4);}  
在keil mdk中,可以使用以下的代码在汇编中调用c函数:
movs r0,#1 ;第一个参数(x1)movs r1,#2 ;第二个参数(x2)movs r2,#3 ;第三个参数(x3)movs r3,#4 ;第四个参数(x4)import my_addbl my_add ;调用“my_add”函数,结果保存在r0中  
如果汇编代码是按照c文件中的嵌入式汇编编写的,应该使用_cpp关键字代替import关键字来引入地址符号。
_cpp的用法如下:
上例程中:
import my_addbl my_add ;调用“my_add”函数,结果保存在r0中  
改为:
bl _cpp(my_add) ;调用“my_add”函数,结果保存在r0中  
在keil  mdk中,_cpp关键字用于访问c或c++编译时的常量表达式,而对于其他工具链,情况可能就有所不同了。
在c代码中调用汇编函数
如果要从c代码中调用汇编函数,在实现汇编函数时,需要注意一下几点:
①若改变了寄存器r4到r11里的任何数值,需要将原始数值保存到栈中,并且在返回到c代码以前恢复原始值。
②若要在汇编函数中调用另一个函数,需要将lr的值保存在栈中,并且利用它执行返回操作。
③函数返回值一般存在r0中
举个例子:如果一个实现4个数相加的汇编函数:
export my_addmy_add functionadds r0,r0,r1adds r0,r0,r2adds r0,r0,r3bx lr ;返回值在r0中endfunc
在c代码中,需要将函数声明为:
extern int my_add(int x1,int x2,int x3,int x4);int y;……y= my_add(1,2,3,4);//调用my_add函数  
如果汇编代码需要访问c代码中的一些变量,也可以使用import关键字。
大多数情况下,可能只需要一到两个简单的汇编函数,所以就想将这些汇编代码嵌入c代码的文件中。多数开发工具都有一种被称作内联汇编的特性,而arm工具链则采用了另外一种特性“嵌入汇编”。
通过嵌入汇编,我们可以在c文件中实现汇编函数。例如,将4个参数相加的函数可以如下写法:
_asm int my_add(int x1,int x2,int x3,int x4){ adds r0,r0,r1 adds r0,r0,r2 adds r0,r0,r3 bx lr ;返回值在r0中}  
可以在c代码中像普通c函数一样调用这个函数:
y = my_add(1,2,3,4);  
嵌入汇编允许你在异常处理中定位栈帧,这也是嵌入汇编的一个优势。


中微爱芯发布AiP74LVC2T45-Q1双向总线收发器
物联网智能医疗离我们还有多远
三星Galaxy S8真机曝光, 没有实体Home键, 连华为mate 9都给它让道!
射频PCB版图绘制流程
麻省理工学院开发低成本传感器手套 成本仅为10美元
在汇编中调用C函数
直流电机调速器工作原理_直流电机调速器的安装过程
带通滤波器的频率介绍
阐述中科创达智能驾驶舱解决方案以及智能网联汽车领域的创新技术和战略布局
COB封装与传统封装的区别及常见问题
基于LM733构建的示波器灵敏度放大器电路
废旧锂电池回收设备自动化处理工艺的介绍
华为P10闪存门不断发酵:华为P10暴跌400!揭秘华为P10闪存门背后的真相
iPhone成为了人们生活里的必需品
国产操作系统究竟哪里不行_国产操作系统为何难普及
2016(第二届)中国智能制造国际论坛圆满落幕
美国联邦监管机构将为WiFi设备开放一条新的频率
基于UWB的应用场景有哪些?UWB解决方案应用案例!
“整体状况非常好”原版苹果零售标志牌被拍卖
仿生萤火虫、萤火之光投影灯互动装置