这两天看了下ARM的东西,呃……乱看为主,谈下我对ARM的理解吧- -

话说ARM是一家RISC架构的CPU的公司,但是这公司不卖具体的CPU,卖的是知识产权,也就是所谓的IP核- -

于是乎各大公司买了他的IP核,添上片上外设(包括数字IO口啊,AD,DA啊,定时器之类的玩意儿),就能拿出来卖了- -

ARM现在比较多的主要是ARM7,ARM9,ARM11,以及Cortax系列,Cortax是现在ARM主推的系列,又分为A,R,M三个小系列,分别对应应用市场,实时市场与嵌入式市场,可以认为他们各自的目标是替代ARM11,ARM9,ARM7

话说Cortax这玩意儿最主要就是引入了Thumb-2指令集,其实在ARM11就有这玩意儿了,只不过那会儿没有那么被看重,在Cortax中Thumb-2被视为核心技术,而不再是像以前Thumb技术一样作为附加功能。嗷……有点乱,从头讲起吧。

话说最早的ARM指令集的特点是每一条指令的长度都是32位也就是4字节、执行只消耗一个时钟周期,而且每一条指令里面都有4位用来标示执行条件。熟悉x86汇编的童鞋肯定还记得那里面条件都是通过jxx指令来搞的,跳来跳去烦得很,而且由于现代处理器都是采用流水线技术,跳来跳去的结果是很多情况下前面预处理了的指令都报废了,于是乎,流水线越长,浪费的时钟周期越多,当年P4的流水线最长达到30多级,可见有多悲催了- - 而ARM把判断条件放到指令里面的话相当于就是纯顺序执行了- -

全32位指令优点很明显,但是缺点也很明显,比较浪费空间- -另外还有些细小的缺点吧- -,于是乎arm引入了Thumb这个16位指令集,他把一些指令的功能精简掉,然后把指令长度压缩到16位,又由于长度都是2字节或4字节的,PC指针(当前指令指针)的最低位是无效的,巧妙的运用PC指针的最后一位来标示当前处理器当前的状态(ARM指令集还是Thumb指令集)。由于Thumb指令集能够实现很多常用功能又只有一半长度,但是又没法实现全部功能,尤其是跟外设有关的一些功能,装B也好,节约资源也好,程序员们在ARM跟Thumb两个状态下面转来转去,转的不亦乐乎- -

于是乎ARM取其精华去其糟粕,干脆搞出来一个混合了长度的Thumb-2指令集,增加了32位部分用来实现Thumb无法实现的功能,为了兼容性,Thumb-2指令集是Thumb的超集,也就是说处理器在加入了Thumb-2功能之后还是能够二进制向下兼容的,只是用不到新功能而已(Cortax-M由于抛弃了ARM指令集,当然就不行了)。由于已经被Thumb占据了一部分集合空间,Thumb-2能够实现的功能肯定没有纯32位的ARM指令集那么多,必然要放弃原ARM指令的一些功能,ARM公司把目标伸向了指令中条件执行的那4位(当然其实不止,不过我知道的主要是这个),Thumb-2指令集不再支持所有指令条件执行,但是如果用8086那种跳来跳去的办法肯定也是不行的,于是ARM引入了另外一条指令,ITXXX ,其中XXX不一定要满三位,而且能够为T,E,分别表示Then,Else,举例来说,ITETE EQ,这条指令就是先判断一下当前条件寄存器是否满足EQ条件,如果满足的话下面的四条指令分别是执行、忽略、执行、忽略。如果不满足的话下面四条指令分别是忽略、执行、忽略、执行。呃……不知道讲清楚没有- - 没看明白回头仔细看看。实际上ITXXX这条指令决定了下面四条指令是否执行,这样子从CPU的角度看,指令还是顺序的,自然也就不会因为分支预测失败而浪费时钟周期。这种情况下,对于那种短if语句,汇编之后效率将是非常高的。

总体上来看,Thumb-2其实是放弃了原来ARM指令的一些功能,得到的是无需状态转换就能够实现16位32位指令混合。

当然,这只是Thumb-2多个新技术中的一个,Thumb-2也只是Cortax多个新技术中的一个- -