基于MDK的汇编语言编写及小灯闪烁的汇编程序实现

一、新建工程

1、打开KEIL5,新建一个工程
在这里插入图片描述
2、在弹出的窗口选择保存位置,文件名称设置为TEST,点击保存
在这里插入图片描述

二、配置环境

1、选择设备

新工程建立好后,弹出设备选择窗口,因为我的开发板版本为STM32F103VET6,因此选择相应的开发板,点击保存
在这里插入图片描述

2、选择运行环境

CMSIS下选择CORE;Device下Startup,其中包含了启动文件;
在这里插入图片描述

3、添加源文件

1、选中Source Group 1,右键,选择Add New Item to Group
在这里插入图片描述
2、添加源文件,因为创建汇编项目,选择 Asm File (.s) ,设置文件名称为TEST,点击保存
在这里插入图片描述
3、出现一个空白文本,显示如下
在这里插入图片描述

三、测试代码

1、源码

1、把下列代码粘贴到TEST.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

2、仿真器设置

1、点击魔术棒进行设置,仿真器的选择根据自己的实际情况进行选择,我这里选择DAP仿真器,如下图所示;
在这里插入图片描述

进行设置时要将电脑与开发板连接,接通电源,否则无法查看到开发板信息。

2、点击Setting后,按照如下设置,能在3处看到相应设备信息,设置好后一直点OK
在这里插入图片描述

3、编译调试

1、先编译程序,无误后进入仿真调试:
在这里插入图片描述
2、由仿真结果可以看到,寄存器的值与程序设定一致
在这里插入图片描述
3、在仿真调试模式下,可以点击以下按钮进行调试
在这里插入图片描述
4、可以看到,动态调试时,变量地址有改变
在这里插入图片描述
在这里插入图片描述

四、HEX文件解读

1、生成HEX文件
打开魔术棒,点击Output,勾选生成HEX文件,确定,然后可以在这个工程保存的目录下找到。
在这里插入图片描述

2、HEX文件格式
开始符号+字节数+地址+类型+数据+校验

冒号llaaaatt[dd…]cc
1字节2字节1字节n字节1字节

3、HEX文件解读:
在这里插入图片描述
由上图HEX文本第一行为例——:020000040800F2
按照HEX文件格式,它可以这样分——:+02+0000+04+0800+F2
  “:”是开始符号;

  02是字节数,代表这个记录当中数据字节的数量;

  0000代表当中数据的开始地址;

  04是数据类型,它可能是以下数据类型当中的一个:

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

  0800是数据;

  F2是校验和域。

校验值计算方法:0x100 - (该行数据所有的数据的累加和%256)
如:020000040800F2
  0x100-((0x02+0x00+0x00+0x04+0x08+0x00)%256)=0xF2

五、闪烁LED的程序

1、按照以上方式建立新的工程,不需要配置环境
2、把以下程序写入

LED0 EQU 0x42218194
RCC_APB2ENR EQU 0x40021018
;GPIOA_CRH EQU 0x40010804
GPIOB_CRL EQU 0x40010C00

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               
                DCD     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,#0x08		
                LDR R1,=RCC_APB2ENR
                STR R0,[R1]
                
                LDR R0,=GPIOB_CRL
                BIC R0,R0,#0XFF0FFFFF	
                LDR R1,=GPIOB_CRL
                STR R0,[R1]
                
                LDR R0,=GPIOB_CRL
                ORR R0,R0,#0X00300000
                LDR R1,=GPIOB_CRL
                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}    

                END

3、编译好后烧录到开发板,最终结果:
在这里插入图片描述

六、总结

  以上就是基于MDK的一个汇编语言的简单编写和动态调试、HEX文件的简单解读,还有令小灯闪烁的汇编程序。

参考

1、ARM汇编基础之基于MDK创建纯汇编语言的STM32工程.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值