? ? ? ?指令集的設(shè)計(jì)是處理器結(jié)構(gòu)中最重要的一個(gè)部分,用ARM的術(shù)語(yǔ)稱之為ISA(Instruction Set?Architecture)。所有的ARM Cortex-M 處理器均基于Thumb-2技術(shù),在一種工作狀態(tài)中允許混合使用16位和32位指令。這一點(diǎn)與傳統(tǒng)的ARM處理器如ARM7TDMI不同。為了更好地理解ARM處理器中不同指令集的差異,接下來(lái)我們簡(jiǎn)單回顧一下ARM指令集的發(fā)展歷史。
? ? ? ? 早期的ARM處理器(在ARM7TDMI處理器之前)僅支持32位ARM指令集。在接下來(lái)的數(shù)年間,ARM架構(gòu)從版本1發(fā)展到版本4,ARM指令集也隨之不斷發(fā)展。ARM指令集功能強(qiáng)大,大多數(shù)指令支持條件執(zhí)行,同時(shí)提供了很好的性能。但是與8位和16位架構(gòu)的處理器相比,32位的ARM指令集需要更多的存儲(chǔ)器空間。隨著手機(jī)等設(shè)備對(duì)32位處理器需求的不斷增加,功耗和成本都變得十分關(guān)鍵。如何減少程序占用空間大小的問(wèn)題亟待解決。
? ? ? ? 在1995年,ARM推出了ARM7TDMI處理器,開(kāi)始支持一種新的工作狀態(tài),可以運(yùn)行一種新的16位指令集。這種16位指令集稱為T(mén)humb指令集(Thumb即大拇指,一語(yǔ)雙關(guān),表明它比ARM指令集占用空間更?。?。ARM7TDMI可以工作在ARM狀態(tài)(默認(rèn)情況下),也可以工作在Thumb狀態(tài)。正常工作時(shí),處理器可以在軟件的控制下在ARM狀態(tài)和Thumb狀態(tài)間切換。程序的一部分利用ARM指令來(lái)編譯,從而獲得更高的性能,其余部分用Thumb指令編譯,從而獲得更高的代碼密度,減少程序占用的空間。利用這種實(shí)現(xiàn)機(jī)制,應(yīng)用程序就可以在縮緊代碼大小的同時(shí)獲得較高的性能。在有些情況下,Thumb代碼可以比相同條件下的ARM代碼減少30%的程序空間。 ??
? ? ? ? 在ARM7TDMI處理器的設(shè)計(jì)中,利用一種映射功能可以將Thumb指令翻譯成ARM指令,之后進(jìn)行解碼。這樣只需要一個(gè)指令譯碼器即可。ARM和Thumb兩種工作狀態(tài)在新的ARM處理器中仍然支持,例如Cortex-A處理器系列及Cortex-R處理器系列。雖然Thumb指令集能夠提供ARM指令集所能提供的大多數(shù)功能,但是它仍然存在一些限制。例如對(duì)可操作的寄存器,尋址模式都存在限制,用于數(shù)據(jù)或地址操作的立即數(shù)范圍也有所減少。 ? ? ? ? ? ??
? ? ? ? 2003年,ARM推出了Thumb-2技術(shù),將16位指令集和32位指令集集成到一種工作狀態(tài)。Thumb-2指令集是Thumb指令集的超集。許多指令是32位的,因此可以像ARM指令集一樣實(shí)現(xiàn)相應(yīng)操作,但是它與ARM指令集有不同的指令編碼方式。第一個(gè)支持Thumb-2技術(shù)的處理器是ARM1156T-2處理器。?
? ? ? ? ?在2006年,ARM發(fā)布了Cortex-M3處理器。Cortex-M3處理器集成Thumb-2技術(shù),僅支持Thumb工作態(tài)。與早期的ARM處理器不同,Cortex-M3處理器不支持ARM指令集。之后更多的Cortex-M處理器發(fā)布,為面向不同市場(chǎng)分別采用了Thumb指令集的不同指令范圍。因?yàn)镃ortex-M3處理器不支持ARM指令集,所以向后不能與傳統(tǒng)的ARM處理器如ARM7TDMI兼容。換句話說(shuō),ARM7TDMI上運(yùn)行的二進(jìn)制鏡像文件不能在Cortex-M3處理器上運(yùn)行。Cortex-M3處理器(ARMv7-M)中的Thumb-2指令集是ARM7TDMI ( AR M v4T)處理器中的Thumb指令集的超集,許多ARM指令可以移植到等價(jià)的32位Thumb指令,從而使應(yīng)用的移植更加方便。
? ? ? ? ?ARM指令集仍在不斷發(fā)展當(dāng)中。2011年,ARM發(fā)布了ARMv8架構(gòu)。它包含了一些新的指令集用于64位操作。當(dāng)前ARMv8架構(gòu)僅限于Cortex-A處理器,Cortex-M處理器暫不包含這種架構(gòu)。