STM32之Thumb指令集

发布于 27 天前  101 次阅读


Thumb指令集是ARM指令集中的一个子集,指令长度为16bit,使用Thumb指令集可以节省系统存储空间。所有的Thumb指令都有对应的ARM指令,Thumb的编程模型和ARM的编程模型相对应。且Thumb子程序和ARM子程序可以相互调用,但执行ARM程序段时,CPU处于ARM工作状态从;若执行Thumb程序段,则CPU处于Thumb工作状态。

打开一个MDK工程的MAP文件,可以发现大量的Thumb程序段。

Thumb指令的特点:

  • 采用16位二进制编码,而ARM指令是32位的。
  • Thumb是压缩指令,先动态解压缩,然后作为标准的ARM指令执行。
  • 由CPSR的T位决定指令流。T置位,执行Thumb指令流,T清0,执行ARM指令流。
  • 由ARM模式进入Thumb模式时,是显式或隐式的进入;由Thumb进入ARM模式时,也是显式或隐式的进入。
  • Thumb指令集没有协处理器指令、信号量指令、乘加指令、64位乘法指令以及访问CPSR和SPSR的指令,而且指令的第2操作数受到限制。
  • 除了分支指令B有条件执行功能外,其他指令均无条件执行。
  • 大多数Thumb数据处理指令采用2地址格式。

Thumb状态切换
在任何时刻,CPSR的第5位(位T)决定了ARM微处理器执行的是ARM指令流还是Thumb指令流。当T置1,则认为是16位的Thumb指令流;当T清0,则认为是32位的ARM指令流。

  • 进入Thumb模式
    进入Thumb指令模式有两种方法:一种是执行一条交换转移指令BX,另一种方法是利用异常返回,也可以把微处理器从ARM模式转换为Thumb模式。
  • 退出Thumb模式
    退出Thumb指令模式也有两种方法:一种是执行Thumb指令中的交换转移BX指令可以显式的返回到ARM指令流。另一种是利用异常进入ARM指令流 。


懒惰是进步的催化剂,也是失败的引擎。