Part 3 ARM指令集
ARM模式和Thumb模式
ARM處理器主要有兩種工作模式(先不算Jazelle)-ARM狀態和Thumb狀態。這些狀態模式與權限級別無關,它們主要區別是指令集,在ARM模式下指令集始終是32-bit,但是在Thumb模式下可以是16-bit或者32-bit。學會怎么使用Thumb模式對于ARM開發很重要。編寫ARM殼代碼時,我們需要避免NULL字節,使用16位Thumb指令而不是32位ARM指令可以降低這種風險。ARM各版本的調用規范容易讓人混淆,不是所有的ARM版本都支持相同的Thumb指令集。后來,ARM 引入了增強的 Thumb 指令集(偽名稱:Thumbv2),它允許 32 位 Thumb 指令甚至允許條件執行,在之前的版本中是不行的。為了在Thumb模式中支持條件執行,引入了“it”指令。但是,該指令隨后又在更高版本中刪除了,被一種更簡單的方式所替換。不同ARM/Thumb指令集的有各種不同變體,一般不同關心這些。只需要知道的是你的目標設備的 ARM 版本及其特定的 Thumb 支持,然后再調整代碼。ARM 信息中可以幫助您確定ARM 版本的細節(http://infocenter.arm.com/help/index.jsp)。
Thumb-1(16 位指令):在ARMv6和更早的體系結構中使用。
Thumb-2(16 位和 32 位指令):在Thumb-1基礎上添加更多指令并允許它們為 16 位或 32 位寬(ARMv6T2、ARMv7)。
ThumbEE:更改和添加了一些支持動態生成代碼的功能(在執行之前或執行期間在設備上編譯代碼)。
ARM模式和Thumb模式的態區別:
條件執行:在ARM模式下所有的指令都支持條件執行。一些版本的ARM處理器可以通過it指令在Thumb工作模式下支持條件執行。
ARM和Thumb模式下的32-bit指令:在Thumb模式下的32-bit指令有.w后綴。
桶型位移器(barrel shifter)是ARM模式下的另一個特點。它可以將多條指令縮減為一條。例如,你可以通過向左位移1位的指令后綴將乘法運算直接包含在一條MOV指令中(將一個寄存器的值乘以2,再將結果MOV到另一個寄存器):
MOV R1, R0, LSL#1 ;R1 = R0 * 2,而不需要使用專門的乘法指令來運算。
要切換處理器在其中執行的狀態,必須滿足以下兩個條件之一:
我們可以使用分支指令 BX(分支和切換狀態)或 BLX(分支、鏈接和切換狀態),并將目標寄存器的最小有效位設置為 1。可以通過偏移量加1來實現,例如0x5530+1。您可能會認為這將導致對齊問題,因為指令是 2 或 4 字節對齊的。這不是問題,因為處理器將忽略最低有效位。詳見Part 6:條件執行和分支。
如果當前程序狀態寄存器的T位被置位,就說明工作在Thumb模式下。
ARM指令簡介
本節簡單介紹ARM指令集以及基本用法。了解匯編語言中的最小部分如何操作,它們之間如何銜接,它們之間能組合成什么樣的功能。
ARM指令后面通常跟著兩個操作數,像下面這樣的形式:
MNEMONIC{S}{condition} {Rd}, Operand1, Operand2
由于ARM指令集的靈活性,并不是所有的指令都用到這些字段。這些字段的解釋如下:
MNEMONIC - 操作指令(機器碼對應的助記符)。
{S} - 可選后綴. 如果指定了該后綴,那么條件標志將根據操作結果進行更新。
{condition} - 執行指令所需滿足的條件。
{Rd} - 目標寄存器,存儲操作結果。
Operand1 - 第一操作數(寄存器或者立即數)
Operand2 - 第二操作數. 立即數或者帶有位移操作后綴(可選)的寄存器。
MNEMONIC, S, Rd和Operand1字段比較明了,condition 和 Operand2字段需要再解釋一下。condition字段與CPSR寄存器的值有關,準確的說是和CPSR某些位有關。Operand2也叫可變操作數,因為它可以有多種形式--立即數、寄存器、帶有位移操作的寄存器。例如Operand2可以有以下多種形式:
#123 - 立即數。
Rx - 寄存器x (如 R1, R2, R3 ...)。
Rx, ASR n - 寄存器x,算術右移n位 (1 = n = 32)。
Rx, LSL n - 寄存器x,邏輯左移n位 (0 = n = 31)。
Rx, LSR n - 寄存器x,邏輯右移n位 (1 = n = 32)。
Rx, ROR n - 寄存器x,循環右移n位 (1 = n = 31)。
Rx, RRX - 寄存器x,擴展的循環位移,右移1位。
讓我們以一個簡單的例子看一下這些指令的不同:
ADD R0, R1, R2 - 將寄存器R1內的值與寄存器R2內的值相加,結果存儲到R0。
ADD R0, R1, #2 - 將寄存器R1內的值加上立即數2,結果存儲到R0。
MOVLE R0, #5 - 僅當滿足條件LE(小于或等于)時,才將立即數5移動到R0(編譯器會把它看作MOVLE R0, R0, #5)。
MOV R0, R1, LSL #1 - 將寄存器R1的內容向左移動一位然后移動到R0(Rd)。因此,如果R1值是2,它將向左移動一位,并變為4。然后將4移動到R0。
來快速總結一下,看一下后續示例中將涉及的一些常用指令:
上一篇:ARM匯編語言入門(四)
下一篇:ARM匯編語言入門
推薦閱讀
史海拾趣
Connect-Tech Products Corp公司自成立以來,一直致力于電子技術的研發與創新。某年,公司研發團隊成功突破了一項關鍵技術,開發出了一款具有高效能、低功耗特點的電子連接器。這一創新不僅提升了產品的競爭力,還為公司贏得了市場的廣泛認可。隨著該產品的推廣和應用,Connect-Tech Products Corp公司的業績逐年攀升,逐漸在電子行業中嶄露頭角。
在電子行業中,產品質量是企業生存和發展的關鍵。成都成電硅海公司深知這一點,因此在生產過程中嚴格把控每一個環節。公司引進了先進的生產設備和技術,建立了完善的質量檢測體系。每一批產品出廠前都要經過嚴格的質量檢測,確保產品性能的穩定和可靠。這種對品質的執著追求,使得成都成電硅海公司的產品在市場上贏得了良好的口碑。
在XXXX年,電子行業迎來了前所未有的變革。隨著物聯網、人工智能等技術的快速發展,傳統的電子產品市場面臨著巨大的挑戰。Faraday Electronics Inc意識到,如果不進行戰略轉型,公司將難以在激烈的市場競爭中立足。于是,公司決定轉型為一家專注于智能硬件和軟件解決方案的提供商。通過這一戰略轉型,公司成功抓住了市場機遇,實現了快速發展。
在電子行業中,單打獨斗很難取得長久的發展。Faraday Electronics Inc深知這一點,因此一直注重與合作伙伴建立長期穩定的合作關系。公司不僅與多家國際知名企業建立了戰略合作關系,還積極與國內高校和研究機構展開產學研合作。通過合作共贏的伙伴關系,公司不斷引進先進技術和管理經驗,提升了自身的核心競爭力。
隨著電子行業的快速發展,貝爾金也緊跟時代步伐,不斷進行技術革新和產品線拓展。2002年,貝爾金為蘋果Dock連接器研發了一系列產品,包括汽車套件、電池組、讀卡器等,這標志著它與蘋果公司的深度合作開始。此后,貝爾金逐漸成為蘋果官方合作配件制造商,其產品在蘋果用戶中享有很高的聲譽。
隨著公司業務的不斷擴展,愛浦電子于XXXX年成立了廣州優聯電氣科技有限公司作為其分支機構。這一舉措不僅進一步擴大了公司的業務范圍和市場影響力,還為公司提供了更多的發展機遇和合作伙伴。廣州優聯電氣科技有限公司在愛浦電子的業務開拓、經營及配套服務方面發揮了重要作用,推動了公司整體業務的快速發展。
這五個故事只是愛浦電子發展起來的一部分縮影,它們展現了公司在技術創新、市場拓展、服務升級、創新引領以及分支機構成立等方面的努力和成就。正是這些不懈的努力和持續的進步,使得愛浦電子在電子行業中脫穎而出,成為一家備受矚目的高新技術企業。
我開發了一款溫控器,選的是PCF8563與24C02,但有些型號的24C02,系統能正常工作.有些型號的24C02卻不能正常工作,具體是時間亂跳.這到底什么回事,高手指點一下啊. CSI/24C02WI/40919G 能正常工作, CSI/24C02WI/0851C 不能正常工作, … 查看全部問答∨ |
我需要檢測一下自己移植完了的USB驅動是否完全工作正常,因此我想在windows ce下編寫一個小應用程序,實現對插入板子usb port的u盤的讀寫。 沒有經驗,請高手執教,指點一下。… 查看全部問答∨ |
wince怎么學 ? 要學哪些東西啊? 還有是不是可以用 .Net 的 C# 做 本人很羨慕做wince開發的,自己沒接觸過wince,所以問題比較多:請有經驗或是知道的能告訴小弟啊,謝謝啦 本人是做c#的web開發的,現在想學wince ? 要學哪些東西啊? 還有是不是可以用 .Net 的 C# 做開發,如果可以用C#開發,那么對 c/c++ 有沒有要求呢? ...… 查看全部問答∨ |