STM32的C与汇编语言混合编程
C语言调用汇编函数
1.Keil创建项目
右键Source Group 1文件创建Func.s与main.c
2.代码
main.c
#include<stdio.h>
extern void Init_1(void);
int main(){
Init_1 ();
return 0;
}
Func.s
AREA My_Function,CODE ,READONLY
EXPORT Init_1
Init_1
MOV R1,#0
MOV R2,#0
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
B LOOP
LOOP_END
NOP
END
3.编译调试运行
编译结果:
调试视频:
结果符合代码预期,R1,R2 从初值“0”循环加“1”,直至R1的值等于“10”时退出循环,R1,R2的值变为10。
修改原汇编语言 Init_1函数
修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。请编程实现,并仿真跟踪调试;
1.代码修改
main.c
#include<stdio.h>
extern void Init_1(int x);
int main(){
Init_1 (0);
return 0;
}
Func.s
AREA My_Function,CODE ,READONLY
EXPORT Init_1
Init_1
ADD R0,#100
END
编译调试运行
编译结果:
调试图片及视频:
哔哩哔哩:嵌入式系统 STM32 C语言调用汇编函数调试2
结果符合预期,传入整型数“0”,函数运行后返回整型数“0+100”,即100,存放在寄存器R0中。
汇编函数中调用一个 C语言函数
1.修改代码
main.c
#include<stdio.h>
extern void Init_1(void);
int main(){
Init_1 ();
return 0;
}
int get(){
return 10;
}
Func.s
AREA My_Function,CODE ,READONLY
EXPORT Init_1
IMPORT get
Init_1
MOV R1,#0
MOV R2,#0
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
BL get
B LOOP
LOOP_END
NOP
END
2.编译调试运行
编译结果
调试结果
哔哩哔哩:嵌入式系统 STM32 C语言调用汇编函数调试3
结果符合预期,汇编函数调用c语言get函数成功 ,R0的值变为10。