
ARM指令集是32位的,程序的啟動都是從ARM指令集開始。主要是以下三個方面:
(資料圖片)
ARM指令使用的基本格式如下:〈opcode〉{〈cond〉} {S} 〈Rd〉,〈Rn〉{,〈operand2〉}< > 是必須項 , {}是可選項
指令格式中符號說明:
opcode操作碼;指令助記符,如ADD、STR等。cond可選的條件碼;執行條件,如EQ、NE等。S可選后綴;若指定“S”,則根據指令執行結果更新CPSR中的條件碼。Rd目標寄存器。Rn存放第1操作數的寄存器。op2第2個操作數。
在數據處理指令中,第二操作數除了可以是寄存器,還可以是一個立即數。如果我們只是希望把一個常數加到寄存器,而不是兩個寄存器相加,我們可以用立即數值取代第二操作數,如下面例子。立即數用前面加一個“#”的數值常量來表示。ADD R3, r3,#1 ;r3 := r3 + 1AND R8, r7,#& ff ;r8 := r7[7:0]
在ARM數據處理指令中,第二操作數還有一種特有的形式-寄存器移位操作,即允許第二個寄存器操作數在同第一操作數運算之前完成移位操作,例如:ADD r3, r2,r1,LSL #3 ;r3:=r2 + 8 × r1
ARM的任何數據處理指令都能通過增加“S”操作碼來設置條件碼(N,Z,C和V)數據處理指令加了“S”后,算術操作(在此包含CMP和CMN)根據算術運算的結果設置所有的標志位
CPSR和SPSR的格式
所有的ARM指令集都可以是有條件執行的。ARM指令根據CPSR中的條件位自動判斷是否執行指令,在條件滿足時,指令執行,否則指令被忽略。在ARM的指令編碼表中,統一占用編碼的最高四位[31:28]來表示“條件碼”(即“cond”)。
轉移 | 解釋 | 一般應用 |
BBAL | 無條件的總是 | 總是執行轉移總是執行轉移 |
BEQ | 相等 | 比較的結果為相等或零 |
BNE | 不等 | 比較的結果為不等或非零 |
BPL | 正 | 結果為正數或零 |
BMIBCC | 負無進位 | 結果為負數算術操作未得到進位 |
BLO | 低于 | 無符號數比較,結果為低于 |
BCSBHS | 有進位高于或相等 | 算術操作得到了進位無符號數比較,結果為高于或相等 |
BVC | 無溢出 | 有符號整數操作,未出現溢出 |
BVS | 有溢出 | 有符號整數操作,出現溢出 |
BGT | 大于 | 有符號整數比較,結果為大于 |
BGE | 大于或相等 | 有符號整數比較,結果為大于或相等 |
BLT | 小于 | 有符號整數比較,結果為小于 |
BLE | 小于或相等 | 有符號整數比較,結果為小于或相等 |
BHI | 高于 | 無符號數比較,結果為高于 |
BLS | 低于或相等 | 無符號數比較,結果為低于或相等 |
ARM指令集是以32位二進制編碼的方式給出的,大部分的指令編碼中定義了第一操作數、第二操作數、目的操作數、條件標志影響位以及每條指令所對應的不同功能實現的二進制位。每條32位ARM指令都具有不同的二進制編碼方式,和不同的指令功能相對應 。編碼表如下:
參考文獻:
孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.