本次我们要运用到汇编语言,并且将其与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与汇编语言混合编程相关推荐

  1. C语言数据交换算法和伪指令,补充:单片机c语言与汇编语言混合编程.ppt

    补充:单片机c语言与汇编语言混合编程 reg51.h和reg52.h:实质上是没有区别的,都是一些特殊功能寄存器的申明 sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0 ...

  2. keil4c语言和汇编混合,keil C语言与汇编语言混合编程

    keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragm ...

  3. 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf

    维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...

  4. c语言混合编程 pdf,C语言与汇编语言混合编程的方法.pdf

    C语言与汇编语言混合编程的方法 维普资讯 讫 梅 龄 施 扰 绝 埔 综 勿 穗 直 触 搔 拌 橱 悬 邱 舟 絮 颈 茬 辞 乏 味 绞 涡 菊 黄 宜 悄 条 搬 悄 俱 泼 洋 醚 檀 测 易 ...

  5. c语言与汇编语言混合编程实验,C语言与汇编语言混合编程实验

    混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...

  6. keil下C与汇编语言混合编程

    文章目录 前言 一.在c函数中调用汇编函数 1.调用不带参数的汇编函数 2.调用带形参的汇编函数 二.在汇编函数中调用c函数 三.汇编函数与c函数混合调用 总结 前言 如今C语言很强大,在嵌入式编程当 ...

  7. c语言汇编混合编程方法,C语言和汇编语言混合编程方法

    摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言.两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用.本文通过具体的实例,说明了混合编程的基本方法, ...

  8. c语言与汇编语言混合编程

    如何从汇编语言过渡到c语言? 从编译过程谈起 编译小知识 源代码编译后得到目标文件 (二进制文件) 不同语言可编译得到相同格式的目标文件 链接器负责将目标文件组装得到可执行文件 老生常谈的问题... ...

  9. ARM下C语言和汇编语言混合编程

    文章目录 一. 在C语言中调用汇编语言 1. 编写代码 2. 调试验证 二. 在汇编语言中调用C语言 1. 编写代码 2. 调试验证 关于函数的传递参数以及接受返回值的原理,在另一篇博客:X86与AR ...

最新文章

  1. Oracle 表的访问方式(2)-----索引扫描
  2. VC++ 保存数据为音频文件(WAV)学习
  3. dependency in POM.xml will lead to jQuery.sap.require
  4. 标杆徐2018 Linux自动化运维实战,标杆徐2018 Linux自动化运维系列⑦: SaltStack自动化配置管理实战...
  5. 邮箱smtpserver及port收集
  6. webmin账户重置密码
  7. 免费学python的网课-学习python的时候观看网课学习还是买书学习效率高?
  8. PS把一张白纸里的黑色图形抠出来
  9. HCIE-Security Day27:IPSec:实验(二)两个网关之间通过手工方式创建IPSec PN隧道
  10. 自定义Unity调色板
  11. trimmed ICP运行出现“aux”、“transform“的error
  12. [转]结婚戒指为什么戴在无名指?
  13. mongodb实现一主两从一个仲裁者
  14. PS中截取一个圆形,画圆
  15. 项目产品化的版本管控实践方案
  16. R语言空间面板数据统计分析
  17. Mobileye REM地图如何解决高精地图落地难点
  18. Java-- Maps
  19. Blender几何节点新手教学
  20. 发邮件时提示连接服务器失败,发送邮件时经常出现发送失败或是连接超时什么原因...

热门文章

  1. Oracle电脑软件,最新Navicat for Oracle下载地址电脑版-CC软件
  2. 019 Android加固之APK加固的原理和实现
  3. 怎样使用CAD在nVisual中创建楼层场景
  4. QT+Python停车场车牌识别计费管理系统
  5. Python黄金相关性市场探析——如何利用相关性寻找最佳建仓时机!
  6. 机器学习:基于概率的朴素贝叶斯分类器详解--Python实现以及项目实战
  7. 毕业设计 - 基于51单片机的电子时钟设计与实现
  8. HDU 1804 Deli Deli
  9. 14种鼻型图解_专家将人类鼻子分为14种,看看你属于哪种?
  10. android dp转px的公式_dp和px换算公式