- 一、在C语言中调用汇编函数
- 1、工程环境
- 2、代码编写
- 3、代码调试
- 4、运行结果
- 二、在汇编语言中调用C函数
- 1、工程环境
- 2、代码编写
- 3、代码调试
- 4、运行结果
- 三、总结
- 四、参考
(1)在keil下新建一个工程,选用STM32F103C8
(2)ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;
CMSIS下选择CORE;
Device下Startup,其中包含了启动文件;
具体如下图所示;
要求:用汇编语言编写函数 ,功能为 传入一个整型数x,函数运行后返回整型数 x+100。并用C语言调用此函数。
(1)在工程中加入main.c和func.s文件
(2)main.c代码如下:
#includeextern int Init_1(int x); //引用外部函数 int main() { int x=20; //定义的变量x,可以直接在这里改变x的值 Init_1(x); return 0; }
(3)func.s代码如下:
AREA My_Function,CODE,READONLY;这一行除了My_Function可以自己取名字以外,其他的都是模板,不能改动 EXPORT Init_1;Init_1是我们在main中用到的函数,这里是做一个函数声明 Init_1 ADD r0,#100;寄存器R0的值加上100再保存到R0中 BX lr;将寄存器R0的值返回到主函数 END;3、代码调试
(1)点击魔法棒
(2)Debug里勾选Use Simulator进行软件仿真
(3)Dialog DLL改为DARMSTM.dll,Parameter改为-pSTM32F103C8
F11 单步调式到 x=20,查看变量x的值,x=20,换成十六进制为 14,正确。
继续单步调试进入外部函数,查看寄存器r0的值,20+100=120,换成十六进制为 78,正确。
与前面相同,此处直接跳过
2、代码编写(1)main.c
#includeextern int asm_main(void); //声明汇编函数 int init_1(int x) { return x+100; } int main() { asm_main(); //调用汇编函数 return 0; }
(2)func.s
AREA My_Fuction,CODE,READONLY;这一行除了My_Function可以自己取名字以外,其他的都是模板,不能改动 import init_1;引入外部函数,即C语言函数init_1 EXPORT asm_main;asm_main是我们在main中用到的函数,这里是做一个函数声明 asm_main MOV r0, #20;寄存器R0的值加上20再存入R0中 BL init_1;调用main中的init_1函数 BX lr;返回主函数 END;3、代码调试
也与前面相同,直接跳过
4、运行结果使用R0进行传参,查看R0的值。20换成十六进制为14,正确。
继续单步调试,查看调用外部函数init后,R0接受的返回值。120的十六进制为78,正确。
学习到了C语言与汇编语言之间进行相互调用的规则,以及简单的汇编语言代码的书写规则。
四、参考1、C语言在ARM中函数调用时,栈是如何变化的?
2、在汇编代码中调用C函数
3、C函数与汇编函数之间参数及返回值传递方法



