歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> ARM指令集 VS thumb指令集

ARM指令集 VS thumb指令集

日期:2017/3/1 11:17:39   编辑:Linux編程

1 thumb指令集概述

為兼容數據總線寬度為16位的應用系統,ARM體系結構除了支持執行效率很高的32位ARM指令集以外,同時支持16位的Thumb指令集。

Thumb指令集是ARM指令集的一個子集,是針對代碼密度問題而提出的,它具有16位的代碼寬度。與等價的32位代碼相比較,Thumb指令集在保留32位代碼優勢的同時,大大的節省了系統的存儲空間。Thumb不是一個完整的體系結構,不能指望處理器只執行Thumb指令集而不支持ARM指令集。

當處理器在執行ARM程序段時,稱ARM處理器處於ARM工作狀態,當處理器在執行Thumb程序段時,稱ARM處理器處於Thumb工作狀態(CPSR的T=0:arm,T=1:thumb)。Thumb指令集並沒有改變ARM體系底層的編程模型,只是在該模型上增加了一些限制條件,只要遵循一定的調用規則,Thumb子程序和ARM子程序就可以互相調用。

與ARM指令集相比較,Thumb指令集中的數據處理指令的操作數仍然是32位,指令地址也為32位,但Thumb指令集為實現16位的指令長度,捨棄了ARM指令集的一些特性,相比之下從指令集上看thumb和arm主要有以下不同:

l 跳轉指令。條件跳轉在范圍上有更多的限制,轉向子程序只具有無條件轉移。

l 數據處理指令。對通用寄存器進行操作,操作結果需放入其中一個操作數寄存器,而不是第三個寄存器。

l 單寄存器加載和存儲指令。Thumb狀態下,單寄存器加載和存儲指令只能訪問寄存器R0~R7。

l 批量寄存器加載和存儲指令。LDM和STM指令可以將任何范圍為R0~R7的寄存器子集加載或存儲,PUSH和POP指令使用堆棧指針R13作為基址實現滿遞減堆棧,除R0~R7外,PUSH指令還可以存儲鏈接寄存器R14,並且POP指令可以加載程序指令PC。

Thumb指令集沒有包含進行異常處理時需要的一些指令,因此,在異常中斷時還是需要使用ARM指令。這種限制決定了Thumb指令不能單獨使用需要與ARM指令配合使用。

2 thumb寄存器和arm寄存器的關系

1)、Thumb 狀態寄存器集是ARM 狀態寄存器集的子集

程序員可直接訪問8 個通用寄存器R0~R7、PC、堆棧指針SP、鏈接寄存器LR和CPSR。每個特權模式都有分組的SP、LR和SPSR。

2)、Thumb狀態寄存器與ARM 狀態寄存器的關系

Thumb狀態寄存器與ARM狀態寄存器有如下關系:

l Thumb狀態R0~R7與ARM狀態R0~R7相同。

l Thumb狀態CPSR和SPSR與ARM狀態CPSR和SPSR 相同。

l Thumb狀態SP映射到ARM狀態R13。

l Thumb狀態LR映射到ARM狀態R14。

l Thumb狀態PC映射到ARM狀態PC(R15)。

3)、在Thumb狀態中訪問高寄存器

在Thumb狀態中高寄存器(寄存器R0~R7為低寄存器,寄存器R8~R15為高寄存器)不是標准寄存器集的一部分,匯編語言程序員對它們的訪問受到限制,但可以將它們用於快速暫存。

可以使用MOV指令的特殊變量將一個值從低寄存器R0~R7轉移到高寄存器R8~R15,或者從高寄存器到低寄存器。CMP指令可用於比較高寄存器和低寄存器的值。ADD 指令可用於將高寄存器的值與低寄存器的值相加。

3 thumb指令集與arm指令集效用分析

在ARM處理器中,內核同時支持32位的ARM指令和16位的Thumb令。對於ARM指令來說,所有的指令長度都是32位,並且執行周期大多為單周期,指令都是有條件執行的。而thumb指令的特點如下:

1、指令執行條件經常不會使用;

2、源寄存器與目標寄存器經常是相同的;

3、使用的寄存器數量比較少;

4、常數的值比較小;

5、內核中的桶式移位器(barrel shifter)經常是不使用的;

3.1 目標代碼大小(密度)

16位的Thumb指令一般可以完成和32位ARM相同的任務。

當用戶使用C程序來處理應用時,如果編譯為Thumb指令,那麼它的目標代碼大小只有編譯為ARM指令時的65%左右,這樣就增加了指令密度。一般認為:

Thumb代碼所需的存儲空間約為ARM代碼的60%~70%。

Thumb代碼使用的指令數比ARM代碼多約30%~40%。

3.2 性能

處理器在這兩種狀態下的性能是依賴於指令執行的存儲器的寬度的。下面的圖2.2具體說明二者的性能比較。


可以看出:

1、在存儲器是32位的情況下,ARM性能略好

這是因為同樣的代碼編譯的結果Thumb指令將會比ARM多30%-40%,Thumb指令仍舊花費同樣指令周期來從32-bit塊內存預取。

2、在16-bit內存上,即使有比ARM多的代碼,這時Thumb性能也較好

這是因為Thumb每一條指令預取需要一個周期而每條ARM指令需要兩個周期,因此盡管thumb指令比arm指令要多,但是依然比arm要快。

另外,在16-bit內存上,Thumb的性能降低了;這是因為數據去操作和特殊的堆棧操作,即使在Thumb下,堆棧操作仍是32-bit操作,導致低的性能在 16-bit內存架構上。

一個改進的方法是提供32-bit的內存來放置堆棧。在這種情況下的性能提高到了32-bit內存架構的水平。主要的差別是因為使用的整型的(32-bit)全局數據將仍被存儲在16-bit內存上。

另外,與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%。

小結

本節回答解釋了第一章提出的問題1和2,即在一般的情況下,Thumb指令與ARM指令的時間效率和空間效率關系為:

l Thumb代碼所需的存儲空間約為ARM代碼的60%~70%。

l Thumb代碼使用的指令數比ARM代碼多約30%~40%。

l 若使用32位的存儲器,ARM代碼比Thumb代碼快約40%。

l 若使用16位的存儲器,Thumb代碼比ARM代碼快約40%~50%。

l 與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%。

顯然,ARM指令集和Thumb指令集各有其優點。

若對系統的性能有較高要求,應使用32位的存儲系統和ARM指令集;

若對系統的成本及功耗有較高要求,則應使用16位的存儲系統和Thumb指令集。

當然,若兩者結合使用,充分發揮其各自的優點,會取得更好的效果。

Copyright © Linux教程網 All Rights Reserved