目录
一、C语言调用汇编函数
二、将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100
三、在汇编函数中调用一个 C语言写的函数
四、总结
五、参考链接:MDK下C与汇编语言混合编程 - the7
一、C语言调用汇编函数
1.打开keil 5新建工程
2.右击Source Group1 添加新项目
3.点击 Asm File(.s) ,输入name ,点击Add
4.输入代码:
5.重复第三步新建c File(.c) 文件,代码如下:
6.准备环境,实现硬件仿真
点击Debug
7.调试
看图中代码7、8行初始化寄存器R1为1、R2为2,单步调试 ,看右边core中R1,R2初始化完成。
二、将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100
下面由于要涉及到arm寄存器的一些分析,所以我在这先简单介绍一下。
R1~R3通常用来传递函数参数
R4~R11用来保存程序运算的中间结果或函数的局部变量
R12通常用来作为函数调用过程中的临时寄存器
R13寄存器是堆栈寄存器(SP),用来保存堆栈的当前指针
R14寄存器是链接寄存器(LR),用来保存函数的返回地址
R15寄存器是程序寄存器(PC),指向程序当前的地址
修改main.c
#includeextern int Init_1(int x); int main() { Init_1(10); return 0; }
修改func.s
Init_1
ADD R0,R0,#100 ;R0记录传入的形参,并且执行R0=R0+100;
BX LR ;跳转的LR的地址执行,在这里,LR记录main函数调用子函数的返回地址
初始化形参
R0初始化为我设置的给定值10
R0=R0+100执行成功
当程序运行到如上图所示时,点击单步调试,注意观察到R14(LR)中的地址-1被加载到R15(PC)指针,PC指针指向该地址,即可返回主程序。
三、在汇编函数中调用一个 C语言写的函数
如在MDK下stm32程序的执行过程为
先执行.s的汇编程序,再.s文件中执行以下操作
- 初始化堆栈指针 SP=_initial_sp
- 初始化 PC 指针 =Reset_Handler
- 初始化中断向量表
- 配置系统时钟
- 调用 C 库函数 _main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界
然后再跳转到main函数,执行一些c语言程序。
在一些对性能要求比较高的情况下,有时也会在c语言程序在内嵌一些汇编代码。
初始化R0为3,R1为4
此代码实现了在c函数中调用汇编函数,再从汇编函数中调用c函数,调用方式与之前大同小异,但是了解c程序和汇编程序相互调用,混合编程还是很有帮助的。
四、总结
通过这次练习学到了混合编程的过程,汇编语言更能看出代码运行的过程,对代码运行更容易理解。



