STM32的C与汇编语言混合编程
本次我们要运用到汇编语言,并且将其与c混合编程。内容较多。
一、在c语言中调用汇编语言
新建一个工程 new project
芯片型号,STM32F103VE
配置如下
创建c文件
代码部分几乎相同,我的代码如下
#include<stdio.h>
extern void Init_1(void);
int main()
{Init_1();return 0;
}
建立汇编文件,在main.c和func.s里面设置相关断点
代码如下
AREA My_Function,CODE,READONLYEXPORT Init_1Init_1MOV R1,#0MOV R2,#0LOOPCMP R1,#10BHS LOOP_ENDADD R2,#1ADD R1,#1B LOOPLOOP_ENDNOPEND
编译,无问题
更改设置。
设置中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文件改写
代码如下
#include<stdio.h>
extern int Init_1(int x);
int main()
{Init_1(5);return 0;
}
汇编文件改写
代码如下
AREA My_Function,CODE,READONLYEXPORT Init_1Init_1ADD R0,#100END
因为在arm编程里,函数调用过程中,子函数的参数值传递按顺序存放在r0,r1,r2,r3里,超过4个参数值传递放栈帧里,所以我们给定的参数值默认是放在R0中的,要想实现x+100,就要对R0寄存器加100。
编译,没有错误
点击debug进入调试
我们可以看到R0的初始值为16进制下的60
点击单步运行调到函数,R0变为5
再次点击进入汇编文件,R0加了100,变为16进制下的105为69
三、在汇编语言中调用c语言
在c文件中写入函数Init_1,将主函数放入汇编文件当中,可以发现,将以前的导入函数EXPORT改为了导入INPORT
c文件的改写
代码如下
#include<stdio.h>
extern int Init_1();
int Init_1()
{int x=5;return x+100;
}
汇编文件的改写
代码如下
IMPORT Init_1AREA MYCODE, CODEEXPORT __main__mainBL Init_1END
编译,没有错误
进入debug调试,按F5跳入主函数的断点处,可以看到寄存器R0变为16进制的105为69
四、总结
本次实验,主要是在c语言中调用汇编语言,是一次全新的尝试。这让我初步理解了一些汇编语言的含义,但是寄存器的工作原理和存储顺序是个难点。我也参考了别人的博客加以了解学习,希望对自己的汇编编程有帮助。
五、参考文章
arm编程,关于函数调用形参实参在通用寄存器和栈帧里的对应关系。用汇编透视c语法操作_ZHONGkunjia的专栏-CSDN博客下面来看个例子,很简单的一个例子,但子函数有大量的形参(10个),以此来看看函数调用过程是如何做形参和实参的复制。//main.c#include int fun(int n0,int n1,int n2,int n3,int n4,int n5,int n6,int n7,int n8,int n9){int m;m=n0+n1+n2+n3+n4+n5+n6+n7https://blog.csdn.net/ZHONGkunjia/article/details/51184489
STM32的C与汇编语言混合编程相关推荐
- C语言数据交换算法和伪指令,补充:单片机c语言与汇编语言混合编程.ppt
补充:单片机c语言与汇编语言混合编程 reg51.h和reg52.h:实质上是没有区别的,都是一些特殊功能寄存器的申明 sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0 ...
- keil4c语言和汇编混合,keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragm ...
- 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf
维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...
- c语言混合编程 pdf,C语言与汇编语言混合编程的方法.pdf
C语言与汇编语言混合编程的方法 维普资讯 讫 梅 龄 施 扰 绝 埔 综 勿 穗 直 触 搔 拌 橱 悬 邱 舟 絮 颈 茬 辞 乏 味 绞 涡 菊 黄 宜 悄 条 搬 悄 俱 泼 洋 醚 檀 测 易 ...
- c语言与汇编语言混合编程实验,C语言与汇编语言混合编程实验
混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...
- keil下C与汇编语言混合编程
文章目录 前言 一.在c函数中调用汇编函数 1.调用不带参数的汇编函数 2.调用带形参的汇编函数 二.在汇编函数中调用c函数 三.汇编函数与c函数混合调用 总结 前言 如今C语言很强大,在嵌入式编程当 ...
- c语言汇编混合编程方法,C语言和汇编语言混合编程方法
摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言.两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用.本文通过具体的实例,说明了混合编程的基本方法, ...
- c语言与汇编语言混合编程
如何从汇编语言过渡到c语言? 从编译过程谈起 编译小知识 源代码编译后得到目标文件 (二进制文件) 不同语言可编译得到相同格式的目标文件 链接器负责将目标文件组装得到可执行文件 老生常谈的问题... ...
- ARM下C语言和汇编语言混合编程
文章目录 一. 在C语言中调用汇编语言 1. 编写代码 2. 调试验证 二. 在汇编语言中调用C语言 1. 编写代码 2. 调试验证 关于函数的传递参数以及接受返回值的原理,在另一篇博客:X86与AR ...
最新文章
- Oracle 表的访问方式(2)-----索引扫描
- VC++ 保存数据为音频文件(WAV)学习
- dependency in POM.xml will lead to jQuery.sap.require
- 标杆徐2018 Linux自动化运维实战,标杆徐2018 Linux自动化运维系列⑦: SaltStack自动化配置管理实战...
- 邮箱smtpserver及port收集
- webmin账户重置密码
- 免费学python的网课-学习python的时候观看网课学习还是买书学习效率高?
- PS把一张白纸里的黑色图形抠出来
- HCIE-Security Day27:IPSec:实验(二)两个网关之间通过手工方式创建IPSec PN隧道
- 自定义Unity调色板
- trimmed ICP运行出现“aux”、“transform“的error
- [转]结婚戒指为什么戴在无名指?
- mongodb实现一主两从一个仲裁者
- PS中截取一个圆形,画圆
- 项目产品化的版本管控实践方案
- R语言空间面板数据统计分析
- Mobileye REM地图如何解决高精地图落地难点
- Java-- Maps
- Blender几何节点新手教学
- 发邮件时提示连接服务器失败,发送邮件时经常出现发送失败或是连接超时什么原因...
热门文章
- Oracle电脑软件,最新Navicat for Oracle下载地址电脑版-CC软件
- 019 Android加固之APK加固的原理和实现
- 怎样使用CAD在nVisual中创建楼层场景
- QT+Python停车场车牌识别计费管理系统
- Python黄金相关性市场探析——如何利用相关性寻找最佳建仓时机!
- 机器学习:基于概率的朴素贝叶斯分类器详解--Python实现以及项目实战
- 毕业设计 - 基于51单片机的电子时钟设计与实现
- HDU 1804 Deli Deli
- 14种鼻型图解_专家将人类鼻子分为14种,看看你属于哪种?
- android dp转px的公式_dp和px换算公式