购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.8 指令系统

Cortex-M3 不再支持ARM指令,而是支持ARMV6Thumb指令,同时引入了Thumb-2指令。Thumb-2 指令是一种新型混合指令集,融合了 16 位和 32 位指令,用于实现密度和性能的最佳平衡。在不对性能进行折中的情况下,它节省了许多高集成度系统级设计的总体存储成本。

Cortex-M3 支持的指令可归纳为 6 大类:数据传送、数据处理、分支指令、系统指令、饱和指令和杂项指令。

数据传送指令可:

(1)在两个寄存器之间传送数据;

(2)在寄存器与存储器之间传送数据;

(3)在寄存器与特殊功能寄存器之间传送数据;

(4)将一个立即数加载到寄存器中。

数据处理指令主要是一些四则运算指令与移位操作指令,包含 16 位与 32 位操作指令。

分支指令又分为无条件跳转及有条件跳转,如B、BL、CBZ指令。

系统指令主要是一些直接针对Cortex-M3 寄存器的操作指令,如CPSIE和CPSID。

饱和指令主要是SSAT和USAT,用于对寄存器进行饱和操作。

由于目前Cortex-M3 进行软件开发时,更多地关注于C语言开发,所以CMSIS也提供了各种对应指令的C语言版本函数及操作寄存器的C语言函数。仅仅在Cortex-M3 的启动文件涉及部分汇编代码。

下面将对启动文件(Startup.s)中涉及的跳转指令和加载指令进行解释说明。

启动文件中使用的跳转指令:

BL和BLX指令可将下一条指令的地址复制到链接寄存器(LR)R14 中。使用BL与BLX时要小心,因为它们还带有改变状态的功能。寄存器reg的LSB必须是 1,以确保处理器不会试图进入ARM状态。如果忘记置位LSB,将会出现UsageFault异常。

加载指令LDR用于把存储器中的内容加载到寄存器中。Startup.s使用了LDR伪指令。如果汇编器发现要产生的立即数是一个程序地址,它会自动地把LSB 置位,例如:

在这个例子中,由于汇编器会认出address1 是一个程序地址,所以自动置位LSB,即R0 的复制不是 0x4000,而是 0x4001。另外,如果汇编器发现要加载的是数据地址,则不会自动置位LSB,例如:

至此,我们可以看一下Startup.s里面的使用情况:

由于C语言不能直接访问Cortex-M3 指令,所以CMSIS提供了通过C语言访问指令及直接访问寄存器的方式,这些方式通过内联汇编的方式实现。

表 1-10 中给出了CMSIS指令关系。

表1-10 CMSIS指令关系 ROR1rzPvtN0WFpi+pCHnB7PldEhZaovArqOXm0PU3VSC1D6hHHGisrIvNrOEKdGf

点击中间区域
呼出菜单
上一章
目录
下一章
×