一个基于STM32汇编程序的编写


一、创建一个新工程

1.创建工程
①点击Project,选择New uvison Project

 

 

 选择文件保存的路径以及文件的名称
2.环境配置
选择对应的芯片,文中使用了STM32F103C8T6

 

 

 运行环境配置,主要是CMSIS下选择CORE;Device下Startup,其中包含了启动文件

 

 

 

二、添加文件

1.鼠标右键单击Source Group 1,选择Add New Item to Group

 

 

 2.选择 Asm File (.s) ,设置源文件的名称,点击Add(.s后缀的为汇编文件)

 

 

 

三、汇编程序

 AREA MYDATA, DATA
    
 AREA MYCODE, CODE
    ENTRY
    EXPORT __main

__main
    MOV R0, #10
    MOV R1, #11
    MOV R2, #12
    MOV R3, #13
    ;LDR R0, =func01

    BL    func01
    ;LDR R1, =func02
    BL    func02
    
    BL     func03
    LDR LR, =func01
    LDR PC, =func03
    B .
        
func01
    MOV R5, #05
    BX LR
    
func02
    MOV R6, #06
    BX LR
    
func03
    MOV R7, #07
    MOV R8, #08    
    BX LR
  • 在仿真运行程序过程中遇到的一些需要注意的问题

如果直接运行程序不可以仿真运行,此时我们需要打开Options of target ,选择Debug

 

 

 

 

 Debug中 左上角有Use simulator 选项勾上 才可以进行仿真,不选择该选项程序无法进行仿真。
之后 我们进行仿真器的选择。
设置硬件仿真器为J_Link根据实际情况选择),仿真器的模式设置为JTAG接口或者SW(根据实际情况选择)。设置完成,连接相应的仿真器会有对应信息显示。
仿真调试(断点设置是在代码行前点击,出现红点,即表明断点设置成功)

 

 

 

四、分析编译生成的Hex文件

 

 

 

 

关于HEX文件的一些解析

 

Code:代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。
RO-data: Read Only data,只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。C语言中const关键字定义的变量就是典型的RO-data。
RW-data: Read Write data,可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。C语言中定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
ZI-data: Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域。它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“ 0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为 0);
ZI-data 的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候会向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。

第一行内容分别是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。

  • 0x02
  • 该行数据中有两个数据
  • 0x00 0x00
  • 本行数据的起始地址位
  • 0x04
  • 用来标识扩展线性地址的记录
  • 该字节还可以是其他值,下面是其他值的含义
  • 00:用来记录数据,HEX文件的大部分记录都是数据记录
  • 01:用来标识文件结束,放在文件的最后,标识HEX文件的结尾
  • 02:用来标识扩展段地址的记录
  • 03:开始段地址记录
  • 05:开始线性地址记录
  • 0x08 0x00
  • 该行两个字节的数据
  • 数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址
  • 0xF2
  • 校验和,校验和= 0x100 - 累加和

五、实验心得
  

通过对于汇编语言的初步学习,理解了汇编语言不像是高级程序设计语言一样具有很强的可读性,要有很强的层次性和逻辑性,对于晦涩不容易懂得汇编语言还需要进行加强一步的学习,才可以利用汇编语言进行程序的设计,而不是简单的Ctrl+C写代码的过程。

虽然汇编语言晦涩难懂,但是学习起来还是挺有乐趣,希望在接下来的学习过程中可以提高写代码的水平,同时利用汇编开发更高效的程序。

参考博客链接如下:https://blog.csdn.net/qq_43279579/article/details/111717607
https://blog.csdn.net/tyustli/article/details/86061856

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM