栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Keil下STM32的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。

符合预期估计。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316040.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号