Cortex-M3 Instruction Set.pdf
# Cortex-M3指令集解析 ## 一、引言 ### 1.1 指令集概览 Cortex-M3是ARM公司为嵌入式应用设计的一款高性能微控制器内核。本手册《Cortex-M3 Instruction Set.pdf》详细介绍了Cortex-M3指令集的各个方面,包括基本指令的操作方式、条件执行、数据处理指令以及内存访问指令等。 ### 1.2 关于指令描述 #### 1.2.1 操作数 指令中的操作数可以是寄存器、立即数或由寄存器与立即数组合而成的表达式。不同的指令支持不同种类的操作数类型。 #### 1.2.2 使用PC或SP时的限制 PC(Program Counter)是指令指针寄存器,而SP(Stack Pointer)是堆栈指针。在使用这两种特殊寄存器时,需要遵循一定的规则和限制。例如,在某些情况下,不能直接修改PC的值。 #### 1.2.3 灵活的第二操作数 Cortex-M3指令集中的一些指令支持灵活的第二操作数(Flexible Second Operand, FSO),这意味着第二个操作数可以是更复杂的表达式,增加了指令的灵活性。 #### 1.2.4 移位操作 Cortex-M3支持多种移位操作,包括逻辑左移(LSL)、逻辑右移(LSR)、算术右移(ASR)以及循环移位(ROR)等。这些移位操作对于处理二进制数据非常有用。 #### 1.2.5 地址对齐 为了提高性能,Cortex-M3对数据访问有特定的地址对齐要求。例如,32位数据通常要求对齐到32位边界上。 #### 1.2.6 PC-相对表达式 PC-相对表达式是一种特殊的寻址方式,它基于程序计数器(PC)的当前值来计算目标地址。这种方式常用于跳转指令中。 #### 1.2.7 条件执行 Cortex-M3支持条件执行,即指令是否执行取决于当前的状态标志。这允许编写更为紧凑且高效的代码。 #### 1.2.8 指令宽度选择 Cortex-M3支持不同宽度的指令,包括32位和16位(Thumb-2)指令。开发者可以根据需求选择最适合的指令宽度,以平衡代码大小与执行效率。 ## 二、内存访问指令详解 ### 2.1 ADR (地址加载) #### 2.1.1 语法 ``` ADR <Rd>, <label> ``` #### 2.1.2 操作 该指令将<label>对应的地址加载到寄存器<Rd>中。 #### 2.1.3 限制 仅当<label>位于当前指令之后时,才能使用ADR指令。 #### 2.1.4 条件标志 该指令不影响任何条件标志。 #### 2.1.5 示例 ```assembly ADR R0, start start: ... ``` ### 2.2 LDR 和 STR (带立即数偏移量的加载与存储) #### 2.2.1 语法 ``` LDR <Rt>, [<Rn>{, #<immed_8>{, LSL #<shift>}}] STR <Rt>, [<Rn>{, #<immed_8>{, LSL #<shift>}}] ``` #### 2.2.2 操作 LDR用于从内存加载数据到寄存器,而STR则用于将寄存器的数据存储到内存中。其中`<Rn>`是基址寄存器,`<immed_8>`是8位的立即数偏移量,`<shift>`是移位量。 #### 2.2.3 限制 偏移量必须能够表示为一个8位立即数,并且在某些情况下还需要加上LSL移位。 #### 2.2.4 条件标志 这些指令不会改变条件标志。 #### 2.2.5 示例 ```assembly LDR R0, [R1, #4] ; 加载R1+4处的数据到R0 STR R0, [R1, #4] ; 存储R0的数据到R1+4处 ``` ### 2.3 LDR 和 STR (带寄存器偏移量的加载与存储) #### 2.3.1 语法 ``` LDR <Rt>, [<Rn>{, <Rs>}] STR <Rt>, [<Rn>{, <Rs>}] ``` #### 2.3.2 操作 这些指令与带有立即数偏移量的版本类似,但是偏移量是由另一个寄存器提供。 #### 2.3.3 限制 偏移量寄存器可以被预索引或后索引。 #### 2.3.4 条件标志 这些指令同样不会改变条件标志。 #### 2.3.5 示例 ```assembly LDR R0, [R1, R2] ; 加载R1+R2处的数据到R0 STR R0, [R1, R2] ; 存储R0的数据到R1+R2处 ``` ### 2.4 LDR 和 STR (非特权访问) #### 2.4.1 语法 ``` LDR <Rt>, [<Rn>{, <Rs>}]! STR <Rt>, [<Rn>{, <Rs>}]! ``` #### 2.4.2 操作 这些指令用于非特权模式下的内存访问,通过使用后索引更新基址寄存器。 #### 2.4.3 限制 非特权模式下,某些限制适用。 #### 2.4.4 条件标志 这些指令不会改变条件标志。 #### 2.4.5 示例 ```assembly LDR R0, [R1, R2]! ; 加载R1+R2处的数据到R0,并更新R1为R1+R2 STR R0, [R1, R2]! ; 存储R0的数据到R1+R2处,并更新R1为R1+R2 ``` ### 2.5 LDR (PC-相对) #### 2.5.1 语法 ``` LDR <Rt>, =<label> ``` #### 2.5.2 操作 该指令从程序计数器(PC)的当前值中计算出一个绝对地址,并将其加载到寄存器中。 #### 2.5.3 限制 <label>必须在当前指令的前后的一定范围内。 #### 2.5.4 条件标志 该指令不改变条件标志。 #### 2.5.5 示例 ```assembly LDR R0, =start start: ... ``` ### 2.6 LDM 和 STM (批量加载与存储) #### 2.6.1 语法 ``` LDM <Rn>!, {<Rlist>} STM <Rn>!, {<Rlist>} ``` #### 2.6.2 操作 LDM用于批量加载多个寄存器的数据,而STM则用于批量存储多个寄存器的数据。 #### 2.6.3 限制 寄存器列表中的寄存器顺序需要按照一定的规则排列。 #### 2.6.4 条件标志 这些指令不会改变条件标志。 #### 2.6.5 示例 ```assembly LDM R13!, {R0-R3, LR} STM R13!, {R0-R3, LR} ``` #### 2.6.6 错误示例 ```assembly LDM R13!, {R0, R2, R1} ; 寄存器顺序错误 ``` ### 2.7 PUSH 和 POP #### 2.7.1 语法 ``` PUSH {<Rlist>} POP {<Rlist>} ``` #### 2.7.2 操作 PUSH将指定的寄存器列表压入堆栈,POP则从堆栈弹出寄存器值。 #### 2.7.3 限制 堆栈指针(SP)必须指向32位对齐的位置。 #### 2.7.4 条件标志 这些指令不会改变条件标志。 #### 2.7.5 示例 ```assembly PUSH {R0, R1, R2} ... POP {R0, R1, R2} ``` ### 2.8 LDREX 和 STREX #### 2.8.1 语法 ``` LDREX <Rt>, [<Rn>] STREX <Rt>, <Rm>, [<Rn>] ``` #### 2.8.2 操作 LDREX加载数据并锁定内存区域以供独占访问,而STREX则尝试释放锁定并存储数据。这两个指令用于实现原子操作。 #### 2.8.3 限制 仅当处理器处于独占访问模式时,这些指令才可用。 ...(更多细节参见文档)
- lzu_zhang2015-06-09不错 很全面 很实用啊
- a8743212013-04-03谢谢,CM-3指令集合
- 粉丝: 8
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java语言实现养老院信息管理系统(SQL Server数据库)
- 社区居民诊疗健康-JAVA-基于SpringBoot的社区居民诊疗健康管理系统设计与实现(毕业论文)
- ChromeSetup.zip
- 大黄蜂V14旋翼机3D
- 体育购物商城-JAVA-基于springboot的体育购物商城设计与实现(毕业论文)
- 三保一评关系与区别分析
- 星形发动机3D 星形发动机
- 机考样例(学生).zip
- Day-05 Vue22222222222
- 经过数据增强后番茄叶片病害识别,约45000张数据,已标注
- 商用密码技术及产品介绍
- CC2530无线zigbee裸机代码实现WIFI ESP8266上传数据到服务器.zip
- 文物管理系统-JAVA-基于springboot的文物管理系统的设计与实现(毕业论文)
- 店铺数据采集系统项目全套技术资料.zip
- 数据安全基础介绍;数据安全概念
- 目标检测数据集: 果树上的tomato西红柿图像检测数据【VOC标注格式、包含数据和标签】