ARM指令集、Thumb指令集、Thumb-2指令集

何为指令集

指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效的工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分 。

对于学习了解过Cortex-M系列的同学应该都知道,ARM芯片属于精简指令集计算机(RISC)

它所用的指令比较简单,有如下特点:

① 对内存只有读、写指令

② 对于数据的运算是在CPU内部实现

③ 使用RISC指令的CPU复杂度小一点,易于设计

而X86架构的芯片使用的是复杂指令集计算机(CISC)

在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行带来的好处就是控制简单,但计算机各部分的利用率不高,执行速度受影响。

ARM、Thumb、Thumb2指令集有什么不同

ARM指令集:

编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在相同频率下运行速度也是最快的, 但也因为每条指令是32bits 的而占用了最多的程序空间。

 

Thumb指令集:

编代码全部是 16bits 的,每条指令所能承载的信息少,因此它需要使用更多的指令才能完成功能, 因此运行速度慢, 但它也占用了最少的程序空间

 

Thumb-2指令集:
在前面两者之间取了一个平衡, 兼有二者的优势, 当一个 操作可以使用一条 32bits指令完成时就使用 32bits 的指令, 加快运行速度, 而当一次操作只需要一条16bits 指令完成时就使用16bits 的指令,节约存储空间。

 ARMv7架构往后的文档,提到的Thumb都是指Thumb-2

MCU使用什么指令集主要由架构决定的,比如Cortex-M3使用的是ARMv7-M,所以是Thumb-2指令集

如何判断CPU使用什么指令集

有些CPU,既支持ARM指令集,也支持Thumb指令集,如何判断取出的指令是ARM指令还是Thumb指令,然后切换状态呢

假设当使用ARM指令写函数A,Thumb指令写函数B,CPU需要执行函数A时进入ARM状态,执行函数B时进入Thumb状态,可以在调用函数A时,让PC寄存器的BIT0等于1,即:PC=函数A地址+(1<<0);调用函数B时,让PC寄存器的BIT0等于0:,即:PC=函数B地址。

如何判断当前CPU使用的是什么指令集

可以通过查询 EPSR.T 的值判断当前运行的指令集类型,为1表示Thumb指令集。

如何区分取出Thumb 指令集是16bit还是32bit

 

 

统一汇编语言(UAL)

ARM公司推出了: Unified Assembly Language(UAL,统一汇编语言),无论使用ARM指令,还是Thumb指令,助记符都是一样的,比如 BX

在UAL下,我们既可以人汇编器决定用那个也可以自己手动指定使用16位还是32位。

ADDS        R0,#1            ;默认使用16位Thumb指令,减小代码体积
ADDS.N     R0,#1            ;使用16位的 Thumb 指令,N = Narrow
ADDS.W    R0,#1            ;使用32位的 Thumb-2 指令,W = wide

如果没有给出后缀,汇编器会先试着用16 位指令以缩小代码体积,如果不行再使用32 位指令

 

posted @ 2017-06-25 22:40  流水灯  阅读(8002)  评论(0编辑  收藏  举报