请选择 进入手机版 | 继续访问电脑版

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

[复制链接]
西门听雨 发表于 2021-1-1 17:48:48 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
文章目次



一、什么是汇编语言?

汇编语言(Assembly Language)也叫面向呆板的步调设计语言,是任何一种用于电子盘算机、微处置处罚器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符取代呆板指令的操纵码,用地点符号或标号取代指令或操纵数的地点。在差别的设备中,汇编语言对应着差别的呆板语言指令集,通过汇编过程转换成呆板指令。特定的汇编语言和特定的呆板语言指令集是一一对应的,差别平台之间不可直接移植。接纳于 百度百科.
二、在Keil下完成一个汇编步调的编写

1、新创建一个工程

相信各位都会在keil中创建一个新的工程,所以在这里就不消我去一一先容了吧。
2、搭建设置环境

2.1、选择设备

设置工程的目的环境,本文基于STM32F103C8,因此在弹出的窗口选择相应的选项,点击保存即可;详细如下图所示;

2.2、选择运行环境

ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;
1、CMSIS下选择CORE;
2、Device下Startup,此中包罗了启动文件;

2.3、添加源文件


选择 Asm File (.s) ,创建汇编文件

3、代码测试

3.1、源码

  1. 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
复制代码
3.2、仿真器设置

为了能在MDK中进行仿真,需要进行一些设置,点击邪术棒,选择Debug,Use Simulator,将下方的Dialog.DLL修改成DARMSTM.DLL,Parameter修改成-pSTM32F103C8(根据你选的芯片来写)


3.3、运行效果


3.4、hex文件


  1. Code:指步调中代码的字节数RO-data:指步调中界说的常量字节数RW-data :步调中已初始化的变量字节数ZI-Data:步调中未初始化的变量字节数可盘算出flash和RAM的占用情况:flash = Code + RO-data + RW-dataram = RW-data + ZI-dat
复制代码
用记事本打开hex文件

此中的寄义可以参考链接
三、简朴的STM32汇编步调—闪烁LED

1、新建工程文件

因为是要用汇编来写步调,所以不需要启动代码,选择否就行。
2、创建一个.s文件

跟上面的步骤一样,创建一个.s文件,并把文件添加到工程中。

3、源码

  1. LED0 EQU 0x40010c00RCC_APB2ENR EQU 0x40021018GPIOA_CRH EQU 0x40010804Stack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_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                                    ENTRYReset_Handler                 BL LED_InitMainLoop        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
复制代码
代码的简朴解说
1,预界说
LED0 EQU 0x422101a0 ;PA8的Bit-Bond地点。
RCC_APB2ENR EQU 0x40021018
GPIOA_CRH EQU 0x40010804
为方便操纵,给每个需要用到的寄存器地点界说一个名字,类似于C语言的#define。PA8的Bit-Bond地点的盘算方法可按上篇文章中C语言的算法算出。反面的两个地点时固定的,可从STM32的手册查询,大概根据ST官方的库文件查找盘算。
2,分配栈空间
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
这一段摘自启动文件。要读懂这段代码,首先要相识两个命令。
AREA命令:AREA 命令指示汇编器汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代码或数据块,它们由链接器处置处罚。格式如下:
AREA 段名,段属性1,段属性2,段属性3。。。
AREA STACK, NOINIT, READWRITE, ALIGN=3
NOINIT: = NO Init,不初始化。
READWRITE : 可读,可写。
ALIGN =3 : 2^3 对齐,即8字节对齐。
SPACE命令:SPACE 命令保存一个用零填充的存储器块。
所以整段的意思为:分配一个STACK段,该段不初始化,可读写,按8字节对齐。分配一个巨细为Stack_Size的存储空间,并使栈顶的地点为__initial_sp。
3,分配向量表
AREA RESET, DATA, READONLY
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
这里的向量可参考我之前写的《STM32向量表详细分析》。
4,开始代码段
AREA |.text|, CODE, READONLY
通知汇编器,开始代码段。
THUMB
REQUIRE8
PRESERVE8
这段的意思是,汇编器支持THUMB指令,代码段按8字节对齐。
ENTRY命令:声明整个程式的入口点,入口点有且仅有一个。不管哪种语言,编译器都得有个入口点,这没什么好说的。
5,步调正式开始。
反面的代码,皆用标准的THUMB2汇编指令。首先相识下代码中用到的指令。
BL:带链接的跳转指令。当使用该指令跳转时,当前地点(PC)会自动送入LR寄存器。
B:无条件跳转。
参考于链接.
4、生成hex



4、烧录到STM32上


5、效果展示



来源:https://blog.csdn.net/luckyspecter/article/details/111848629
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )