新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > arm指令集 從匯編開始

        arm指令集 從匯編開始

        作者: 時間:2016-11-20 來源:網絡 收藏
        特點:
        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著


        關鍵詞: arm指令集匯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 灵川县| 湘潭市| 湟中县| 绥阳县| 漳平市| 荆州市| 息烽县| 涪陵区| 盐源县| 枣阳市| 德清县| 鹿泉市| 师宗县| 松溪县| 湟源县| 上饶市| 罗城| 徐闻县| 综艺| 桓台县| 钟山县| 鄂尔多斯市| 北海市| 通道| 明水县| 宜昌市| 嘉黎县| 图片| 阿尔山市| 余江县| 沂源县| 浦北县| 页游| 绍兴市| 云和县| 台中县| 修文县| 大竹县| 唐河县| 黑龙江省| 博客|