这两天写的两篇文章《浅谈ARM处理器》和《浅谈RISC CPU(精简指令集处理器)》,大家比较关注,有读者说能不能再深入一点,今天我就再试着深入的聊一聊。
在前面的文章,我们说到ARM微处理器支持两种指令集,即ARM指令集和THUMB指令集。
今天我们来聊一聊这两种指令集。
ARM处理器的工作状态
两种指令集的更深一步含义,是指ARM处理器会有两种工作状态,即ARM指令集对应的ARM状态,和THUMB指令集对应的THUMB状态。这两种状态,可以通过相应的指令,进行转换。
ARM指令集和THUMB指令集的关系
THUMB指令集是ARM指令集的子集,所有的Thumb指令都有相对应的ARM指令。
Thumb的体系结构还不是很完整,所以不能要求处理器,只支持Thumb代码,却不支持ARM指令集。Thumb代码对通用功能支持较好,对于一些非通用功能,则可以借用ARM指令集。所以应用程序可以混合使用ARM指令和Thumb程序,以达到提升性能和代码密度的目的。同时可以降低功耗、节约成本。
对指令集来讲,用户最关心的是,指令的数量和运行效率,下面我们来做一个比较。
- THUMB存储空间约为ARM代码的60%~70%。
- THUMB指令数比ARM代码多约30%~40%。
- 存储器为32位时,ARM代码比Thumb代码快约40%。
- 存储器为16位时,Thumb比ARM代码快约40~50%。
- 使用Thumb代码,存储器的功耗会降低约30%。
ARM和THUMB工作状态切换方法
ARM指令集和Thumb指令集中,均有切换处理器工作状态的指令(BX),可以在两种工作状态之间相互切换。ARM处理器在初始化(开始)执行代码时,处于ARM状态。
- 进入Thumb状态
对于“BX Rm”指令,当操作数寄存器的状态位即Rm[0]为1时, 可以采用执行“BX Rm”指令的方法,使微处理器从ARM状态切换到Thumb状态(执行该指令能够将Rm[0]位传送给CPSR[T]位)。
例如:BX Rm指令的Rm[0]值为1,执行其实现ARM处理器从ARM状态切换到Thumb状态(即使得CPSR[T]位置1)。
当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到Thumb状态。
- 切换到ARM状态
对于“BX Rm”指令,当操作数寄存器的状态位即Rm[0]为0时,执行“BX Rm”指令时可以使ARM微处理器从Thumb状态切换到ARM状态。
例如:BX Rm指令的Rm的位[0]值为0,执行其实现ARM处理器从Thumb状态切换到ARM状态(即使得CPSR[T]位置0)。
在处理器进行异常处理时,把PC指针放入异常模式寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
小结
THUMB指令集和ARM指令集相互补充,相互配合的特点,让使用者可以进行更高效,低成本的编程,达到提升性能和代码密度的目的,所以我们很有必要对两种指令集,进行更深入的学习和更细致的比较。