一、在keil5里面利用C语言调用汇编函数
1.建立新工程
首先点击Project里面的 New uVision Project…
然后输入文件名main1,点击保存即可。
我这里选择的芯片是STM32F103VE
然后进行配置(如图):
2.编辑代码
首先在左上方工程下右击Source Group ,选择Add New Item to Group…,
C语言代码编辑:
先创建C文件,点击C File(.c),然后输入name,点击Add
然后输入C语言代码
C语言代码:
#include<stdio.h>
extern void Init_1(void);
int main()
{
Init_1();
return 0;
}
汇编语言编辑
还是在左上方工程下右击Source Group ,选择Add New Item to Group…,
然后选择 Asm File(.s),输入name,点击Add即可。
然后输入汇编代码:
代码:
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
此段汇编代码的解释:
AREA指令定义了一个代码段,段名为 My_Function,属性为只读;
EXPORT 将C程序中的函数Init_1连接起来;
MOV R1,#0
MOV R2,#0
这是把R1,R2寄存器初始化,取值为0;
CMP R1,#10
BHS LOOP_END
将R1的值与10相比较,若R1大于10,就跳到LOOP_END;
ADD R2,#1
ADD R1,#1
这是将寄存器R1,R2分别加1;
B LOOP 再次循环;
END 表示结束。
3.编译调试
首先点击魔法棒,
然后进行设置,点击Debug,勾选Use Simulator,将dialog dll下改为DARMSTM.dll ,将parameter下改为-pSTM32F103C8。用于设置支持STM32F103C8的软硬件仿真。
进行编译,没有错误,
点击图示图标进行调试,
进行单步调试,发现R1从1变到9,出现A时,程序结束。
二、改写汇编程序
将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。
1.C程序改写
代码:
#include<stdio.h>
extern int Init_1(int x);
int main()
{
Init_1(5);
return 0;
}
2.汇编程序改写
代码:
AREA My_Function,CODE,READONLY
EXPORT Init_1
Init_1
ADD R0,#100
END
解释:
要想实现X+100,在arm编程里,函数调用过程中,子函数的参数值传递按顺序存放在r0,r1,r2,r3里面,超过4个参数值传递放栈帧里(可自行查阅),这里给定参数默认放在R0里面,所以要对寄存器R0+100 。
3.编译调试
点击编译,没有错误,
点击图标进行调试,
点击F5单步调试,R0为5,
然后点击汇编程序,R0加了100,变成105,这里16进制下的105是69 。
三、在汇编程序中调用C语言中的函数
1.C语言程序改写
代码:
#include<stdio.h>
extern int Init_1();
int Init_1()
{
int x=5;
return x+100;
}
2.汇编程序改写
代码:
IMPORT Init_1
AREA MYCODE, CODE
EXPORT __main
__main
BL Init_1
END
解释:这里的IMPORT Init_1 表示汇编程序里面进口或引入C里面的函数Init_1。
3.编译调试
点击调试,按F5进入断点,看见R0变为69,16进制下69为105 。
四、总结
通过这次实验,我熟悉了keil5下汇编语言和C语言的混用,既能在C语言里面调用汇编程序,也能在汇编程序里面调用C函数,也更加清楚地了解了寄存器的原理。
五、参考文献
https://blog.youkuaiyun.com/qq1742517469/article/details/120701323