一、在C语言中调用汇编函数
1、工程环境
(1)在keil下新建一个工程,选用STM32F103C8
(2)ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;
CMSIS下选择CORE;
Device下Startup,其中包含了启动文件;
具体如下图所示;
2、代码编写
要求:用汇编语言编写函数 ,功能为 传入一个整型数x,函数运行后返回整型数 x+100。并用C语言调用此函数。
(1)在工程中加入main.c和func.s文件
(2)main.c代码如下:
#include<stdio.h>
extern 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;
EXPORT Init_1;
ADD r0,#100;
BX lr;
END;
3、代码调试
(1)点击魔法棒
(2)Debug里勾选Use Simulator进行软件仿真
(3)Dialog DLL改为DARMSTM.dll,Parameter改为-pSTM32F103C8
4、运行结果
F11 单步调式到 x=20,查看变量x的值,x=20,换成十六进制为 14,正确。
继续单步调试进入外部函数,查看寄存器r0的值,20+100=120,换成十六进制为 78,正确。
二、在汇编语言中调用C函数
1、工程环境
与前面相同
2、代码编写
(1)main.c
#include <stdio.h>
extern 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;
IMPORT init_1;
EXPORT asm_main;
asm_main
MOV r0, #20;
BL init_1;
BX lr;
END;
3、代码调试
也与前面相同,直接跳过
4、运行结果
使用R0进行传参,查看R0的值。20换成十六进制为14,正确。
继续单步调试,查看调用外部函数init后,R0接受的返回值。120的十六进制为78,正确。