ARM指令集与Thumb指令集
1、Thumb指令集來源
ARM的RISC體系結構的發展中已經提供了低功耗、小體積、高性能的方案。而為了解決代碼長度的問題,ARM體系結構又開發了一種新的指令體系,就是Thumb指令集,稱之為T變種。
Thumb是ARM體系結構的擴展(thumb不是一個完整的體系結構,不能指望處理器只執行thumb指令集而不支持arm指令集)。它從標準32位ARM指令集抽出來的36條指令格式,重新編成16位的操作碼。這能帶來很高的代碼密度,例如:在1K的存儲空間中,可以放32條ARM指令,就可以放64條Thumb指令,因此Thunb指令代碼密度高。
2、Thumb指令集和ARM指令的時間復雜度和空間復雜度對比
在ARM處理器中,內核同時支持32位的ARM指令和16位的Thumb令。
- 當用戶使用C程序來處理應用時,如果編譯為Thumb指令,Thumb代碼使用的指令數要比ARM代碼多約30%~40%,但最終生成的目標代碼所需的存儲空間約為ARM代碼的60%~70%(因為每條指令所占空間是arm指令的一半)。
?
- 使用32位存儲器,ARM代碼比Thumb代碼快約40%;使用16位存儲器,Thumb代碼比ARM指令快約40%~50%。具體解釋如下:
在存儲器是32位的情況下,ARM性能較好,這時因為同樣的代碼編譯的結果Thumb指令將會比ARM 多,Thumb指令仍舊花費指令周期來從32-bit塊內存預取。在16-bit內存上,即使有比ARM多的代碼,這時Thumb性能也較好,因為Thumb每一條指令預取需要一個周期而每條ARM指令需要兩個周期。
另外在16-bit內存上,Thumb的性能降低了;這是因為數據去操作和特殊的堆棧操作,即使在Thumb下,堆棧操作仍是32-bit操作,導致低的性能在16-bit內存架構上。一個改進的方法是提供32-bit的內存來放置堆棧。在這種情況下的性能提高到了32-bit內存架構的水平。主要的差別是因為使用的整型的(32-bit)全局數據將仍被存儲在16-bit內存上。
與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%。
3、Thumb指令集和ARM指令的混合編程
若兩者結合使用,充分發揮其各自的優點,會取得更好的效果。Thumb以其較高的代碼密度和在窄存儲器上的性能,使得它在很多系統中得到廣泛應用。但在很多情況下,還是不得不使用ARM指令,這是因為:
①ARM處理器的一些特定功能必須由ARM指令實現,其中包括PSR指令(不能直接訪問CPSR 和SPSR,必須先切換到ARM狀態下,再使用MSR和MRS來實現)、協處理器指令;
②異常發生時,處理器自動進入ARM狀態,即在異常中斷處理程序入口的一些指令是ARM指令(ARM程序頭ARMassemblerheader),然后根據需要程序可以切換到Thumb狀態,在異常中斷處理程序返回前,程序再切換到ARM狀態。如果異常處理程序需要使用Thumb指令也必須通用一個。
③ARM處理器總是從ARM狀態開始執行,如果要在調試器中運行Thumb程序,必須為該Thumb程序添加一個ARM程序頭,然后再切換到Thumb狀態,調用該Thumb程序。
?
基于以上原因,即使程序需要由Thumb代碼實現,也必須通過ARM-Thumb互交(ARM-Thumbinterworking)進入Thumb狀態。ARM-Thumb互交是指對匯編語言和C/C++語言的ARM和Thumb代碼進行連接的方法,它進行兩種狀態(ARM和Thumb狀態)間的切換。在進行這種切換時,有時需使用額外的代碼,這些代碼被稱為Veneer。AAPCS定義了ARM和Thumb過程調用的標準。
?
ref:
https://www.sohu.com/a/339622340_100281310
https://www.21ic.com/app/mcu/201812/780644.htm
http://www.elecfans.com/emb/574929.html
https://www.21ic.com/embed/jiaocheng/jichu/201806/61024.html
https://www.xuebuyuan.com/1257101.html
https://www.cnblogs.com/fx427103/p/3968243.html
總結
以上是生活随笔為你收集整理的ARM指令集与Thumb指令集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我看三国有感而发
- 下一篇: ARM指令集 --RISC精简指令集