STM32 启动代码汇编指令详解

发布者:春林初盛最新更新时间:2021-02-06 来源: eefocus关键字:STM3  启动代码  汇编指令 手机看文章 扫描二维码
随时随地手机看文章

● 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} 为地址的寄存器中。 

注意:

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

 

refer:

https://blog.csdn.net/cacti_one/article/details/72811281 

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

上一篇:STM32 启动代码 __main 与用户主程序 main() 的区别
下一篇:STM32 结构体对齐规则

推荐阅读最新更新时间:2024-11-10 23:17

ARM的启动代码(3):异常向量
ARM的启动代码是非常重要的代码,直接关系到系统的稳定性和可靠性(这里主要讨论arm7, arm9;cortex系列的会在后续的文章中讨论)。上次我们通过两则文章讨论了ARM启动代码的过程, ARM的启动代码(1):介绍 ARM的启动代码(2):AT91SAM9260启动详解 这次我们聊聊ARM的代码的具体编写。那么什么样的代码会涉及到这些问题呢? 1.Bootloader或者位于启动序列上进行加载其他应用程序的程序; 2.单独的二进制镜像,直接可以在ARM处理器上直接执行。 这两种代码都需要对 ARM 的启动过程有深入理解。说深入理解,其实只有一条,闹闹记住,ARM7,ARM9的异常向量表从地址0开始。这是铁打不能改
[单片机]
常用ARM汇编指令及ATPCS规则
在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时的初始化,进出中断时的环境保存、恢复,对性能要求非常苛刻的函数等。 只在必要情况下使用汇编指令,只涉及几条汇编指令。 1.相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令的前后32M:-32M~+32M。它们是位置无关的指令。使用示例: b fun1 ...... fun1: bl fun2 ...... fun2: ...... 2.数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另一个寄存器,或者把
[单片机]
常用ARM<font color='red'>汇编指令</font>及ATPCS规则
ARM9代码分析启动MAIN.C
1 #define GLOBAL_CLK 1 2 3 #include stdlib.h 4 #include string.h 5 #include “def.h” 6 #include “option.h” 7 #include “2440addr.h” 8 #include “2440lib.h” 9 #include “2440slib.h” 10 #include “mmu.h” 11 #include “profile.h” 12 #include “memtest.h” 13 14 //extern置于变量或函数之前,以标示变量或函数的定义在别的文件中 15 extern
[单片机]
STM32入门学习笔记之温湿度采集实验1
11.1 实验简介 11.1.1 温度采集方案概述 本实验采用三种方式来获取温湿度值,一种是STM32芯片内部自带的温度传感器,一种是基于单总线协议的DS18B20温度传感器,还有一种就是温湿度传感器DHT11或者DHT22,但是在成本上DHT22比较高,所以实验仅使用DHT11,DS18B20和内部温度传感器进行。 11.1.2 单线协议 单总线协议是美国的达拉斯公司推出的一款总线通信协议,所谓单线协议,就是通过一根线传输所有的数据,通俗地讲就是根据低电平的时间来判断总线上的数据是0还是1,比如拉低总线10us,就认为发送的是1,拉低总线50us,就认为发送的是0,单总线协议中,有3种时序,即写时序,读时序和检测时序。我们在
[单片机]
STM32入门学习笔记之温湿度采集实验1
STM32开发板上实现按键驱动(定时扫描去抖方式)
在万利STM32学习板的USB摇杆例程中,摇杆的按键处理并没有消抖处理,因此重新修改了摇杆的驱动,顺便还增加了两个按键以及摇杆中键下压的驱动,以方便直接使用。只要定时调用(几ms)KyeScan函数,就会将当前按键的改变情况和按住情况保存在对应的变量中。 当某个键按下时,在KeyDown中对应的位被设置为1;某个键被释放时,KeyUp中对应的位为1;KeyPress中保存的是当前按键的按住情况,某位为1时表示对应的键被按住。 KeyDown和KeyUp中的值使用后要手动清除,表示已经处理了这个事件,而KeyPress不用手动清除,它一直反映按键的按住情况。 万利的板子上有两个按键KEY_2和KEY_3,另外还有一个摇杆:K
[单片机]
arm启动代码详细分析
arm启动代码详细分析 所谓启动代码,就是处理器在启动的时候执行的一段代码,主要任务是初始化处理器模式,设置堆栈,初始化变量等等.由于以上的操作均与处理器体系结构和系统配置密切相关,所以一般由汇编来编写.   具体到S64,启动代码分成两部分,一是与ARM7TDMI内核相关的部分,包括处理器各异常向量的配置,各处理器模式的堆栈设置,如有必要,复制向量到RAM,以便remap之后处理器正确处理异常,初始化数据(包括RW与ZI),最后跳转到Main.二是与处理器外部设备相关的部分,这和厂商的联系比较大.虽然都采用了ARM7TDMI的内核,但是不同的厂家整合了不同的片上外设,需要不同的初始化,其中比较重要的是初始化WDT,初始化各子
[单片机]
STM32-SPI
1 SPI概述 SPI是高速全双工同步串行通信接口,主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。 在用一般的SPI接口的IC的时候,由于数据量小,速度要求不是特别高,且数据量不一定是整字节(比如12位的AD转换器),一般可以使用模拟SPI,方便快捷。这里有一个通过软件模拟SPI操作片外AD转换器MCP3208的例子。 而对于一些存储器件,使用SPI则比较有优势,硬件SPI稳定性好,速度快,适合读写大量数据。本文记的就是STM32的SPI硬件模块。 1.1 接口 SPI主要有四根线 MOSI、MISO、SCK、CS。 MISO:主设备输入/从设备输出引脚。
[单片机]
STM32-SPI
LPC2114启动代码分析
LPC2114启动代码的编写主要包括: 1.异常向量表的建立 2.MCU各种模式堆栈的初始化 3.系统基本的初始化工作 下面分别进行介绍. (一)ARM相关指令及伪指令 LDR PC,ResetAddr 将ResetAddr标号地址所指的内容传送给PC寄存器 LDR PC,=ResetAddr 将ResetAddr标号地址传送给PC寄存器 ResetAddr DCD ResetInit 为ResetAddr分配一个字的地址空间,以ResetInit初始化,即ResetAddr地址所指的内容为ResetInit标号地址 SvcStackSpace Space SVC_S
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved