我是靠谱客的博主 难过月亮,最近开发中收集的这篇文章主要介绍基于MDK创建纯汇编语言的STM32工程汇编语言基于MDK创建纯汇编语言的STM32工程代码仿真器设置HEX文件用汇编点亮LED,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 汇编语言
  • 基于MDK创建纯汇编语言的STM32工程
  • 代码
  • 仿真器设置
  • HEX文件
  • 用汇编点亮LED

汇编语言

  • 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
  • 许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
  • 汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。
  • 汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
  • 汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的寄存器AX、BX中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性
  • 再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。
  • 正因为汇编语言有“与机器相关性”的特性,程序员用汇编语言编写程序时,可充分对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态。这样编写出来的程序执行代码短、执行速度快。汇编语言是各种编程语言中与硬件关系最密切、最直接的一种,在时间和空间的效率上也最高的一种。

基于MDK创建纯汇编语言的STM32工程

1、首先在KEIL5中新建一个工程
在这里插入图片描述
给自己的工程命名,选择保存的路径
在这里插入图片描述
然后再选择自己的芯片的类型
在这里插入图片描述
ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;
CMSIS下选择CORE;
Device下Startup,其中包含了启动文件;
在这里插入图片描述
这样一个工程就创建好了。
然后在添加一个源文件
在这里插入图片描述
因为创建汇编项目,所以选择的文件不是==.c== 而是==.s==
选择 Asm File (.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

仿真器设置

根据自己的下载方式设置硬件仿真器

进入之后,选择自己的下载方式,然后进入setting
在这里插入图片描述

在这里插入图片描述
显示出自己的下载器之后就可以进行下载了。
但是如果你没有硬件的乎也可以不用下载而直接在KEIL中进行调试,这时的设置就不一样了。
在这里插入图片描述
这是我们在Debug中就选择左边的,这是keilz中的仿真调试,在我们没有硬件的时候就可以用仿真来进行代码的调试。
在这里插入图片描述
当我们点击下面的调试按钮之后就会看到上面的调试界面。
在这里插入图片描述
这几个按钮时我们在调试中比较常用的
第一个标有RST字样的是复位,单击之后,程序就会跑到最开始的位置运行;
紧接着第二个按钮是全速运行,单击之后程序就会全速跑起来;
再然后第三个按钮是停止按钮,当程序全速运行起来时候,单击停止按钮程序就会立即停止,可以观察程序运行到哪里去了。
其他的按钮就是关于子函数或者循环是否进入的操作了,具体自己可以试试看。

在这里插入图片描述
可以看到左边R5 R6 R7 R8 R9的值为空的,运行代码后,寄存器就有了值。
在这里插入图片描述

HEX文件

编译调制之后,我们还可以在KEIL中选择生成.HEX文件。
点击魔术棒,在output中勾选中HEX文件。这样在我们编译之后就会在我们保存的位置生成一个.HEX的文件
在这里插入图片描述
打开这个文件我们会看到下面的内容:

:020000040800F2
:1000000018060020ED000008F5000008F7000008C1
:10001000F9000008FB000008FD00000800000000D7
:10002000000000000000000000000000FF000008C9
:10003000010100080000000003010008050100089C

这里只截取了前5行。分析的时候我们可以进行如下的操作

:02 0000 04 0800 F2
:10 0000 00 18060020ED000008F5000008F7000008 C1
:10 0010 00 F9000008FB000008FD00000800000000 D7
:10 0020 00 000000000000000000000000FF000008 C9
:10 0030 00 01010008000000000301000805010008 9C

这样我们就把每一行分为了了5个部分,各个部分的意义为:

第一个Byte为数据长度
第二第三两个Byte代表地址偏移量
第四个Byte代表数据类型,
接下来是数据区,
最后一个Byte是校验码。

其中数据类型只有6种

00-数据记录
01-文件结束记录
02-扩展段地址记录
03-开始段地址记录
04-扩展线性地址记录
05-开始线性地址记录

这样就很明显的看到前五行中,除了第一行的数据类型为04,是地址记录内容,
其他的四行都是数据记录的内容

用汇编点亮LED

在上面我们已经知道了怎么创建一个汇编语言的工程,那么我们这次就可以新建一个工程然后再这个工程中添加代码就可以了
在这里插入图片描述

LED0 EQU 0x422101a0 
RCC_APB2ENR EQU 0x40021018
GPIOA_CRH EQU 0x40010804


Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp



                AREA    RESET, DATA, READONLY

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                    
                    
                AREA    |.text|, CODE, READONLY
                    
                THUMB
                REQUIRE8
                PRESERVE8
                    
                ENTRY
Reset_Handler 
                BL LED_Init
MainLoop        BL LED_ON
                BL Delay
                BL LED_OFF
                BL Delay
                
                B MainLoop
             
LED_Init
                PUSH {R0,R1, LR}
                
                LDR R0,=RCC_APB2ENR
                ORR R0,R0,#0x04
                LDR R1,=RCC_APB2ENR
                STR R0,[R1]
                
                LDR R0,=GPIOA_CRH
                BIC R0,R0,#0x0F
                LDR R1,=GPIOA_CRH
                STR R0,[R1]
                
                LDR R0,=GPIOA_CRH
                ORR R0,R0,#0x03
                LDR R1,=GPIOA_CRH
                STR R0,[R1]
                
                MOV R0,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC}

             
LED_ON
                PUSH {R0,R1, LR}    
                
                MOV R0,#0 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC}
             
LED_OFF
                PUSH {R0,R1, LR}    
                
                MOV R0,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC}             
             
Delay
                PUSH {R0,R1, LR}
                
                MOVS R0,#0
                MOVS R1,#0
                MOVS R2,#0
                
DelayLoop0        
                ADDS R0,R0,#1

                CMP R0,#330
                BCC DelayLoop0
                
                MOVS R0,#0
                ADDS R1,R1,#1
                CMP R1,#330
                BCC DelayLoop0

                MOVS R0,#0
                MOVS R1,#0
                ADDS R2,R2,#1
                CMP R2,#15
                BCC DelayLoop0
                
                
                POP {R0,R1,PC}    
             
                NOP
             END

汇编语言的详细介绍可以参考王爽的《汇编语言》。

最后

以上就是难过月亮为你收集整理的基于MDK创建纯汇编语言的STM32工程汇编语言基于MDK创建纯汇编语言的STM32工程代码仿真器设置HEX文件用汇编点亮LED的全部内容,希望文章能够帮你解决基于MDK创建纯汇编语言的STM32工程汇编语言基于MDK创建纯汇编语言的STM32工程代码仿真器设置HEX文件用汇编点亮LED所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部