Keil下的STM32的c与汇编语言混合编程

本文通过一个实例详细介绍了如何在C语言中调用汇编语言,以及如何改写汇编语言以实现特定功能,如在C中调用汇编函数,将汇编函数改写为接收参数并返回值。此外,还展示了如何在汇编语言中调用C函数。整个过程包括代码编写、编译和调试,帮助读者深入理解C与汇编的交互机制。
摘要由CSDN通过智能技术生成

目录

一,在C语言中调用汇编语言

二,汇编语言的改写

三,在汇编语言中调用C语言

四,总结

一,在C语言中调用汇编语言

新建一个工程

 

 选择芯片型号,我选的是STM32F103VE

配置如下

 

 建立c文件

 

建立汇编文件

 

 代码解释:

EXPORT是将c文件中定义的函数相关连起来;

像Init_1、LOOP、LOOP_END这种顶头写的为程序段名,这是跳转程序的参照;

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程序结束。

编译成功

 

因为需要用到仿真调试,所以需要改一下设置。

 设置中Debug下,勾选Use Simulator,将dialog dll下改为DARMSTM.dll ,将parameter下改为-pSTM32F103C8。

然后点击debug调试

 

 点击单步调试,可以看到R1从1变到9,当为A(10在16进制下为A)时 ,跳出汇编程序

 

二, 汇编的改写

将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。

C语言改写

汇编文件的改写 

 解释:之所以让R0加100,是因为在arm编程里,函数调用过程中,子函数的参数值传递按顺序存放在r0,r1,r2,r3里,超过4个参数值传递放栈帧里,所以我们给定的参数值默认是放在R0中的,要想实现x+100,就要对R0寄存器加100。

编译ok

 点击debug调试

可以看到R0的初始值为16进制下的60。

单步运行调到函数,R0变为5。

 

再次点击进入汇编文件,R0加了100,变为16进制下的105为69

 

三,调用C语言。

在c文件中写入函数Init_1,将主函数放入汇编文件当中,可以发现,将以前的导入函数EXPORT改为了导入INPORT

C语言的改写

 汇编语言的改写

编译无误

 

 进入debug调试,按F5跳入主函数的断点处,可以看到寄存器R0变为16进制的105为69

四,总结

这次实验学习了C语言和汇编语言之间的相互调用,让我对汇编语言的理解更加清晰,期待更深入的实验。 

 

参考文章

arm编程,关于函数调用形参实参在通用寄存器和栈帧里的对应关系。用汇编透视c语法操作_ZHONGkunjia的专栏-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值