STM32 启动代码汇编指令详解

发布者:ph49635359最新更新时间:2019-04-01 来源: eefocus关键字:STM32  启动代码  汇编指令 手机看文章 扫描二维码
随时随地手机看文章

● EQU 


伪指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的"#define"。


语法格式:name EQU expr{ , type} 


注意:语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的; 


name:数值(expr)的符号名称;


expr:一个与内核寄存器相关的地址,或一个绝对地址,或一个与PC相关的地址,或一个32位整型常量;

 

type:可选项,它可以是ARM、THUMB、CODE16、CODE32或DATA中的任何一个。 


举个例子:


fiq EQU 0x1C,CODE32


● AREA

 

伪指令AREA用来定义一个代码段或数据段(data section),到底是数据段还是代码段可以从属性名词分辨出。 


语法格式:


AREA sectionname{,attr}…{,attr}… 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。 


sectionname:


代码段或数据段的名称。惯用|.text|,它被用于由C编译器产生的代码段或和C库相关的代码段。 


它是一块独立的不可分割的数据段或代码段,可以为任何名称。


不过,非字符起始的必须加下划线,如1_dataarea。 


attr:由一个或多个被逗号隔开的节(或段)属性组成。 


段属性有:ALIGN=expression,表示这个数据或代码段按2^expression个字节对齐; 


NOINIT表示不零初始化; 


READWRITE表示可读可写; 


DATA表示只对数据段进行操作,默认可读可写。 


注意:


伪指令DATA已经被编译器忽略了,不过它可以作为属性使用。 


此外还有其他的属性,这里就不过多介绍了,详见《汇编器用户指南》。


● SPACE 


伪指令SPACE用于在存储器中开辟一段连续的存储空间,并初始化为零。 


语法格式:{label} SPACE expr 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。 


label:它是可选的。


它可以是任何不与编译器冲突的字符名称,可以被用来说明开辟的内存空间的名称或作用。 


expr:


开辟的零初始化存储空间的大小,即字节数。也可是某一个有确定数值的字符。 

举个例子:若Stack_Size=0x40,那么语句 Stack_Mem SPACE Stack_Size是正确的。


● PRESERVE8 


伪指令PRESERVE8指定当前的文件中,堆栈区的对齐方式为8字节对齐。 


语法格式:PRESERVE8 {bool} 


注意:


语法格式中{ }不属于语法格式的部分,并且{ }中的内容是可选的。 

bool:它是可选的。


它不是 true 就是 false,默认为true。


● THUMB 


伪指令THUMB命令汇编器以UAL语法将THUMB后面的指令翻译成T32指令。 


语法格式:


THUMB


● EXPORT 


伪指令EXPORT用于在程序中声明一个全局的标号,该标号可在其他的文件中被引用。 


语法格式:


EXPORT的语法格式共有5种,下面主要介绍下启动代码中用到的3种。

 

1)EXPORT { [WEAK]} 


2)EXPORT symbol { [SIZE=n]} 


3)EXPORT symbol [ WEAK {,attr}{type{,set}}{,SIZE=n}] 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。 


[WEAK]:


表示其他的同名标号优先于该标号被引用。如果省略symbol,那么所有的标号都是“WEAK”。 


从启动代码中可以发现,中断服务函数是弱声明的(由[WEAK]关键字标注)。


弱声明:


如果用户定义了相同的函数则启动代码中的该函数失效而使用用户定义的中断服务函数。


这样是为了防止用户使能了中断而没有中断服务函数,从而造成程序崩溃。


假设使能了中断,而用户又没有定义这个中断服务函数则会进入默认中断,默认中断为死循环。 


symbol:


它是全局属性标号,区分大小写,如果省略symbol,那么所有标号都是全局的。


● IMPORT 


IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中被定义(即在外部文件中被定义,相当于C语言中的extern),但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的标号表中。


该标号在程序中区分大小写。 


语法格式: 


1)IMPORT symbol { [type]} 

2)IMPORT symbol { [SIZE=n]} 

3)IMPORT symbol [WEAK{,attr}…{,type}…{,SIZE=n}] 


[WEAK]:


[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0。


若该标号被B或BL指令引用,则将B或BL指令置为NOP操作。 


symbol:


它分别在汇编源文件、目标文件或库文件中,区分大小写。


● DCD 


伪指令 DCD 用于分配一片连续的字存储单元并用指定的数据初始化。


用 DCD 分配的字存储单元是字对齐的。 


语法格式:


{label} DCD {U} expr {,expr} 


expr:


它是程序表达式或数字表达式


● IF ELSE ENDIF 


伪指令 IF,ELSE,ENDIF 用来允许有条件的汇编指令或伪指令。 


语法格式: 


IF logic-expression 

 指令序列1 

ELSE 

 指令序列2 

ENDIF 


说明:


IF,ELSE,ENDIF 伪指令能根据条件的成立与否决定是否执行某个指令序列。


当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。


其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。 


此外,伪指令IF,ELSE,ENDIF可以嵌套使用。 


逻辑表达式 logic-expression 也可以为单目运算。


如单目操作数 :DEF: ,:DEF:A则表示如果A被定义,则为真,否则为假。


● PROC 


伪指令 PROC 标志着程序的开始。


● ENDP 


伪指令 ENDP 标志着程序(调用)的结束。


● END 


伪指令 END 告诉汇编器已经到源程序文件的末尾。

 

● B 


指令 B 是跳转指令。 


语法格式:


B label 


在启动代码中,会发现 label 是一个点“.”,它表示跳转到当前的指令地址处(即当前的 PC 值),也就是进入到当前的死循环中了。


● BX 


指令 BX 是跳转指令。 


语法格式:


BX Rm 


其中,Rm 是一个内核寄存器,它的值是一个地址值。


上述指令表示程序跳转到 Rm 所指向的指令处。


● LDR 


LDR 既可以作为加载指令使用,也可以作为伪指令。 


作为伪指令时的语法格式:


LDR Rt, =expr


其作用是将 expr 的值(expr为立即数)或 expr 的地址(expr是一个标号)加载到 Rt 中。 


作为加载指令时的语法格式:


LDR {type}{cond} Rt, [Rn {, #offset}]


其作用是将 Rn(Rn的值是一个地址值)中的数值加载给 Rt。


● ORR 


指令 ORR 是逻辑或操作指令。 


语法格式:


ORR {S} {cond} Rd, Rn, operand2 


其中,Rn 是第一操作数,operand2 是第二操作数。


上述指令表示将 Rn 和 operand2 进行逻辑或操作,其结果保存到目标操作数 Rd 中。


● STR 


STR 是一个典型的存储指令。 


语法格式:


STR {type}{cond} Rt, [Rn {, #offset}]。


该指令表示将寄存器 Rt 中的字数据存放到以 Rn{+offset} 为地址的寄存器中。 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。


关键字:STM32  启动代码  汇编指令 引用地址:STM32 启动代码汇编指令详解

上一篇:STM32 启动代码分析详解
下一篇:STM32 启动代码 __main 与用户主程序 main() 的区别

推荐阅读最新更新时间:2024-03-16 16:26

基于STM32和HAL库创建一个IIC设备
1 简述 使用面向对象的编程思想封装IIC驱动,将IIC的属性和操作封装成一个库,在需要创建一个IIC设备时只需要实例化一个IIC对象即可,本文是基于STM32和HAL库做进一步封装的。 底层驱动方法不重要,封装的思想很重要。在完成对IIC驱动的封装之后借助继承特性实现AT24C64存储器的驱动开发,仍使用面向对象的思想封装AT24C64驱动。 2 IIC驱动面向对象封装 iic.h头文件主要是类模板的定义,具体如下: //定义IIC类 typedef struct IIC_Type { //属性 GPIO_TypeDef *GPIOx_SCL; //GPIO_SCL所属的GPIO组(如:GPIOA)
[单片机]
STM32的系统时钟与SystemInit函数
以上在stm32f4xx中文参考手册的截图 SYSCLK时钟的来源有3个分别是 HSI HSE PLL 我们主要的时钟有 低速的内部时钟 LSI RC震荡产生 32KHZ 低速的外部时钟 LSE 32.768KHZ晶振 高速的内部时钟 HSI RC震荡16MHZ 高速的外部时钟 HSE 一般为8Mhz 一般情况我们的SYSCLK时钟选择PLLCLK 看看我们的函数是怎么操作时钟分配的! 启动文件首先先配置时钟然后在运行用户主函数,打开SystemInit函数 ** * @brief Setup
[单片机]
<font color='red'>STM32</font>的系统时钟与SystemInit函数
Crypto算法库使用技巧之基于STM32 AES GCM应用提示
引言 X-CUBE-CRYPTOLIB 是基于 STM32 的 Crypto 算法库,支持对称密钥、非对称密钥、哈希等多种算法。正确地使用 Cyrptolib 算法库,可以在应用程序中实现数据加密、设备身份认证、加密通信等多种应用层所需的安全功能。相反,若不能正确地使用算法库往往会带来加解密数据错误等系列问题。 关于 STM32 Crypto 算法库应用中的常见的问题之一就是应用程序没有使能 MCU 的CRC 模块,尽管输出的数据和期望值不同,但加解密函数的调用并未返回异常。本文在此描述另外一种没有正确使用算法库的情况。 问题描述 客户应用项目中需要在固件更新过程中对固件进行加密并验证,根据推荐采用了 AES- GCM 算
[单片机]
stm32启动指向0x1FFFF020
stm32启动的时候,一直跑不起来,然后进行debug, PC指针总是指向0x1FFFF020,这是boot脚设置错误,解决办法为:将boot0设置为0,boot1设置为任意!
[单片机]
<font color='red'>stm32</font><font color='red'>启动</font>指向0x1FFFF020
stm32复位电路工作原理
stm32复位电路工作原理 相信大家对复位电路已经很熟悉了,复位电路是一种用来使电路恢复到起始状态的电路设备,这次我们来讨论一下stm32复位电路工作原理。 stm32是嵌入式单片机,专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核,主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)。 stm32复位电路设计 复位电路能够让系统恢复到初始状态,单片机的复位方式一共有上电复位、系统复位、备份区域复位。
[单片机]
分享一点STM32硬件设计的经验
声明:由于下述内容不起眼但很重要,所以别的人肯定是不会写出来告诉你的啦。 很多经验都是从错误中总结出来的,所以没有实践,哪会犯错,没有犯错,哪来经验。 我曾经设计了一个基于STM32的工控板,引出了JTAG调试接口,当我把板子上的电源部分和STM32最小系统部分先焊好以后,先试一下JLINK V8能否顺利下载程序,结果插上JLINK V8以后,JLINK的灯变成了红色。正常的时候是绿色。所以我知道这里肯定有问题了。 JLINK灯变红,据我以前的经验,一般就是复位引脚有问题。所以我用万用表量了一下复位引脚的电压,结果是0V。 我们看复位电路,正常情况下,复位以后,复位引脚应该是高电平(3.3V)才对。 我首先怀疑电容C11是不是
[单片机]
分享一点<font color='red'>STM32</font>硬件设计的经验
STM32中断优先级--学习心得
刚开始学习STM32单片机时,对中断优先级的规则不是很明白,通过今天的学习,对这方面的内容有了新的了解,记录下来以便日后查看。 首先说一下STM32的中断: STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个) 中断的管理方法: 1.首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB- AIRCR中配置: 即设置优先级分组:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
[单片机]
STM32 RTC Alarm的使用
以STM32F072CB做的测试 官方参考应用文档:AN4759 RTC日历时钟配置 通过两个预分频得到1hz的时钟用来更新日历。 异步预分频:PREDIV_A,7-bit(0-127) 同步预分频:PREDIV_S,15-bit(0-32767) 频率计算公式如下: Fck=Frtcclk/((PREDIV_A-1)*(PREDIV_S-1)) 所以计算出PREDIV_A和PREDIV_S的值在配置时记得减1。 配置举例: 比如选择LSI=40khz作为RTC的时钟源,要产生1hz的时钟,就可以配置PREDIV_A=39,PREDIV_S=999 比如选择LSE=32.768khz作为RTC的时钟源,要产生1hz的
[单片机]
<font color='red'>STM32</font> RTC Alarm的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved