1. 程式人生 > >arm指令集

arm指令集

特點:
Load / Store結構(儲存器操作僅包括load和store,所有其他操作在暫存器中完成)
32位固定指令寬度
3地址指令格式(即兩個源運算元和結果暫存器都獨立指定)
每條指令都條件執行
可在單週期執行的單條指令內同時完成一項普通以為操作和一項普通ALU操作

自動變址功能

暫存器模型
使用者模式下
R1-R15的15個32位通用暫存器堆,R15為PC暫存器
CPSR的狀態暫存器高四位表示N(負數)、Z(零)、 C(進位)、V(溢位)標誌

分類介紹:
    +-------------+-------------+-----------+
    | 資料處理指令| 資料傳送指令| 控制流指令|
    +-------------+-------------+-----------+

------------------------------------------------------------------------------
資料處理指令:對暫存器內資料進行算術或邏輯操作
    簡單暫存器操作
        算術操作: ADD, ADC, SUB, SBC, RSB, RSC
            說明: RSB和RSC分別為反向減法和帶進位反向減法
            舉例:    ADD r0, r1, r2        ; r0 = r1 + r2
                RSB r0, r1, r2        ; r0 = r2 - r1
        按位邏輯操作: AND,ORR,EOR,BIC
            說明:按位與,按位或,按位異或,and not
            舉例:    BIC r0, r1, r2        ; r0 = r1 and not r2
        暫存器傳送操作:MOV,MVN
            說明: MVN為按位取反傳送
            舉例:    MVN r0, r2        ; r0 = not r2
        比較操作:CMP,CMN,TST,TEQ
            說明: 比較,取反比較,位測試,測試相等
            舉例:    TEQ r1, r2        ;
        注意:運算元順序格式為結果暫存器,第一運算元,第二運算元
    立即數操作:
        說明: 在數字前面加#表示立即數,加#&表示16進位制立即數
        舉例:    ADD r3, r3, #1        ; r3 = r3 + 1
            AND r8, r7, #&ff    ; r8 = r7 & 0xFF
    暫存器移位操作:四地址指令
        移位指令:LSL, LSR,ASL,ASR,ROR,RRX
        說明: 邏輯左移,邏輯右移,算術左移,算術右移,迴圈右移,擴充套件
            一位的迴圈右移
        舉例:    ADD r3, r2, r1, LSL #3    ; r3 = r2 + (r1 << 3)
    設定條件碼:
        說明:任何資料處理指令都可以設定條件碼(NZCV),比較操作只能設
            置條件碼,如果其他資料處理操作要設定條件碼,需要增加S
            操作碼來指明。
            算術操作(包括CMP,CMN)根據算術運算結果來設定所有標誌
            位,邏輯和傳送操作不產生有意義的C或V值,這些操作根據結
            果來設定N和Z,保留V,沒有移位操作時,保留C;或者當移位
            時,將移位移出的最後位設定為C。
        舉例:    ADDS    r2, r2, r0
            ADC    r3, r3, r1
    乘法操作:
        說明: 第二運算元不可以為立即數
            結果暫存器不允許為源暫存器
            如果設定位S,則標誌位V保留,標誌為C不再有意義。
            長乘的話,高32位有效位放入第二個結果暫存器。
        舉例:    MUL r4, r3, r3            ; r4 = r3 * r2
            MLA r4, r3, r2, r1        ; r4 = r3 * r2 + r1

------------------------------------------------------------------------------
資料傳送指令:在ARM暫存器和儲存器之間傳送資料
    基本資料傳送指令
        單暫存器的Load / Store指令
        多暫存器的Load / Store指令
        單暫存器的交換指令:主要用於系統級程式,實現原子操作。
    定址模式:ARM的資料傳送指令包括暫存器間接定址,基址偏移和基址變址,
        說明:在任何情況下都需要有一個ARM暫存器來寄存地址,該地址靠近
            需要傳送資料的地址。
        舉例:    LDR r0, [r1]    ; r1內數值代表的儲存器位置的內容讀入r0
            STR r0, [r1]    ; 將r0寫入r1內數值代表的儲存器位置

        前變址(pre-indexed)
            說明:基址暫存器不包含確定地址,在基址上加上不超過4KB
            的偏移量來定址
            舉例:    LDR r0, [r1, #4]    ; 定址r1+4
            自動變址的前變址:
                說明:自動變址時,會同時實現對基址暫存器的修改。
                舉例:LDR r0, [r1, #4]!    ; 定址r1+4並將r1+=4
        後變址(post-indexed)
            說明:基址不加偏移定址,立即數偏移量僅用作基址修正
            舉例:    LDR r0, [r1], #4    ; 定址r1,並將r1+=4
    任意位元組對齊的指令:LDRB

    多暫存器資料傳送和塊傳送(塊傳送略)
        說明:同時存取幾個暫存器,允許16個暫存器的任意子集合用單條
        指令傳送。支援自動變址
        舉例:    LDMIA r1, {r0, r2, r5}    ;將[r1],[r1+4],[r1+8]分別
                讀入r0, r2, r5

------------------------------------------------------------------------------
控制流指令
    轉移指令(branch)
        說明:無條件轉移B,BAL
        舉例:    B LABEL        ; LABEL為某個位置
    條件轉移
        說明:    BEQ    相等
            BNE    不等
            BPL    非負
            BMI    負
            BCC    無進位
            BCS    有進位
            BLO    小於(無符號數)
            BHS    大於等於(無符號數)
            BHI    大於(無符號數)
            BLS    小於等於(無符號數)
            BVC    無溢位(有符號數)
            BVS    有溢位(有符號數)
            BGT    大於(有符號數)
            BGE    大於等於(有符號數)
            BLT    小於(有符號數)
            BLE    小於等於(有符號數)
            和其中BCC和BLO,BCS和BHS的二進位制程式碼相同
    條件執行
        說明:有時可以用條件執行來代替轉移,要使用條件執行,要在3字元
            的操作碼之後增加2字元的條件碼,條件碼應該在其他任何
            修正碼之前。
        舉例:    CMP r0, #5
            ADDNE    r1, r1, r0
            SUBNE    r1, r1, r2
            ; 在r0!=5的情況下才會執行後續加減語句
    轉移和連結指令和子程式返回指令
        說明:用於跳轉並返回,比如子程式,BL指令,注意不能巢狀子程式,
            否則上一級的返回地址將被下一級的返回地址覆蓋,這時應該
            把返回地址和變數儲存到堆疊上,使用STMFD和LDMFD
    監控程式呼叫(略)
        說明:軟中斷相關,可用於提供IO訪問
    跳轉表(略)
        說明:用於子程式列表較長時,注意要檢測跳轉表越界

------------------------------------------------------------------------------
參考文獻           
《ARM SoC 體系結構》第二版 Steve Furber著