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

目录

一:在c语言中调用汇编语言

代码写入

调试

二:修改参考代码功能

代码写入

调试 

三:在汇编程序中调用c程序

写入程序

调试

 总结


一:在c语言中调用汇编语言

代码写入

创建新工程:

建立新工程后,添加一项新项目(New item)。点击第一项C File(.c),因为是写main函数(main.c)。

 勾选如下:

 

在新创建的main.c函数中写入如下程序:

 再添加一项新项目,不过这次选择Asm File(.s)项,因为写Func.s函数,写入汇编语言

 在Func.s函数中写入如下汇编语言:

AREA  My_Function,CODE,READONLY         
    EXPORT Init_1 
    
Init_1

    MOV R1,#0                ;设R1寄存器是i
    MOV R2,#0                ;设R2寄存器是j
    
LOOP                    ;写在最左边的是程序名的段名,执行跳转程序时要用到
    CMP R1,#10                ;比较R1和10的大小
    BHS LOOP_END                 ;如果R1大于或等于10.则跳转到LOOP_END程序段
    ADD R2,#1                 ;j++        
    ADD R1,#1                 ;i++
    B LOOP                    ;执行一次循环后,无条件再次进入循环判断,即是跳转到LOOP段
    
LOOP_END    
    NOP
    END 

汇编程序如下,观测程序,程序结束时R1和R2的值应是十进制的10。

 然后点击左上角构建,正常情况下应如下图所示

然后点击魔法棒,为了之后的调试再修改几项设置。

将“Create HEX File”一项打勾:

将“Use Simulator”一项打勾,并且修改Diglog DLL和Parameter如下图所示:

调试

 然后点击调试按钮,进入调试页面:

观测左侧寄存器,R1和R2的初始状态都是0;

 然后点击单步运行,一边点击一边观察。

 发现,R1和R2的最终值固定在十六进制的A,相当于十进制的10。与预先估计值相同。

二:修改参考代码功能

现在加一点难度,修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;

代码写入

修改汇编语言,将之前的循环删除,只写将整型数加100的语句:

汇编程序Func.s代码如下:

修改main.c函数,因为和刚才比增加了调用函数操作,所以将调用函数的参数加上。并且加上输出返回值的语句。

c语言函数main.c如下:

从程序中可以看到,在主函数中的实参为10,即调用的函数的初始值为10,然后经过Func.s函数的处理,处理值应该是110。则在调试中,R0寄存器的初始值应是十六进制的A,终值应是十六进制的6E。

 编译构建如下:

调试 

进入调试页面:

单击单步调试,在单击一次后可以看到,R0的初始值变成了A。

单击第二次后,可以看到,R0的终值变成了6E。

符合预期估计。 

三:在汇编程序中调用c程序

写入程序

修改main.c函数如下:

 修改Func.s函数如下:

 编译构建结果:

调试

 进入调试页面:

单击单步运行按钮并观察,R0寄存器的值保持为十六进制的5,R1和R2寄存器的值稳定上升,达到十六进制的A后不再上升。满足程序代码。

 总结

本篇博客内容较简单,过程比较清晰,要是不懂一些更基础的操作,请移步

https://blog.youkuaiyun.com/afadgfansfa/article/details/120535658?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值