<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > arm指令集 從匯編開始

          arm指令集 從匯編開始

          作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
          特點:
          Load / Store結(jié)構(gòu)(存儲器操作僅包括load和store,所有其他操作在寄存器中完成)
          32位固定指令寬度
          3地址指令格式(即兩個源操作數(shù)和結(jié)果寄存器都獨立指定)
          每條指令都條件執(zhí)行
          可在單周期執(zhí)行的單條指令內(nèi)同時完成一項普通以為操作和一項普通ALU操作

          自動變址功能

          寄存器模型
          用戶模式下
          R1-R15的15個32位通用寄存器堆,R15為PC寄存器
          CPSR的狀態(tài)寄存器高四位表示N(負數(shù))、Z(零)、 C(進位)、V(溢出)標(biāo)志

          分類介紹:
          +-------------+-------------+-----------+
          | 數(shù)據(jù)處理指令| 數(shù)據(jù)傳送指令| 控制流指令|
          +-------------+-------------+-----------+

          ------------------------------------------------------------------------------
          數(shù)據(jù)處理指令:對寄存器內(nèi)數(shù)據(jù)進行算術(shù)或邏輯操作
          簡單寄存器操作
          算術(shù)操作: 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 ;
          注意:操作數(shù)順序格式為結(jié)果寄存器,第一操作數(shù),第二操作數(shù)
          立即數(shù)操作:
          說明: 在數(shù)字前面加#表示立即數(shù),加#&表示16進制立即數(shù)
          舉例: ADD r3, r3, #1 ; r3 = r3 + 1
          AND r8, r7, #&ff ; r8 = r7 & 0xFF
          寄存器移位操作:四地址指令
          移位指令:LSL, LSR,ASL,ASR,ROR,RRX
          說明: 邏輯左移,邏輯右移,算術(shù)左移,算術(shù)右移,循環(huán)右移,擴展
          一位的循環(huán)右移
          舉例: ADD r3, r2, r1, LSL #3 ; r3 = r2 + (r1 << 3)
          設(shè)置條件碼:
          說明:任何數(shù)據(jù)處理指令都可以設(shè)置條件碼(NZCV),比較操作只能設(shè)
          置條件碼,如果其他數(shù)據(jù)處理操作要設(shè)置條件碼,需要增加S
          操作碼來指明。
          算術(shù)操作(包括CMP,CMN)根據(jù)算術(shù)運算結(jié)果來設(shè)置所有標(biāo)志
          位,邏輯和傳送操作不產(chǎn)生有意義的C或V值,這些操作根據(jù)結(jié)
          果來設(shè)置N和Z,保留V,沒有移位操作時,保留C;或者當(dāng)移位
          時,將移位移出的最后位設(shè)置為C。
          舉例: ADDS r2, r2, r0
          ADC r3, r3, r1
          乘法操作:
          說明: 第二操作數(shù)不可以為立即數(shù)
          結(jié)果寄存器不允許為源寄存器
          如果設(shè)置位S,則標(biāo)志位V保留,標(biāo)志為C不再有意義。
          長乘的話,高32位有效位放入第二個結(jié)果寄存器。
          舉例: MUL r4, r3, r3 ; r4 = r3 * r2
          MLA r4, r3, r2, r1 ; r4 = r3 * r2 + r1

          ------------------------------------------------------------------------------
          數(shù)據(jù)傳送指令:在ARM寄存器和存儲器之間傳送數(shù)據(jù)
          基本數(shù)據(jù)傳送指令
          單寄存器的Load / Store指令
          多寄存器的Load / Store指令
          單寄存器的交換指令:主要用于系統(tǒng)級程序,實現(xiàn)原子操作。
          尋址模式:ARM的數(shù)據(jù)傳送指令包括寄存器間接尋址,基址偏移和基址變址,
          說明:在任何情況下都需要有一個ARM寄存器來寄存地址,該地址靠近
          需要傳送數(shù)據(jù)的地址。
          舉例: LDR r0, [r1] ; r1內(nèi)數(shù)值代表的存儲器位置的內(nèi)容讀入r0
          STR r0, [r1] ; 將r0寫入r1內(nèi)數(shù)值代表的存儲器位置

          前變址(pre-indexed)
          說明:基址寄存器不包含確定地址,在基址上加上不超過4KB
          的偏移量來尋址
          舉例: LDR r0, [r1, #4] ; 尋址r1+4
          自動變址的前變址:
          說明:自動變址時,會同時實現(xiàn)對基址寄存器的修改。
          舉例:LDR r0, [r1, #4]! ; 尋址r1+4并將r1+=4
          后變址(post-indexed)
          說明:基址不加偏移尋址,立即數(shù)偏移量僅用作基址修正
          舉例: LDR r0, [r1], #4 ; 尋址r1,并將r1+=4
          任意字節(jié)對齊的指令:LDRB

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

          ------------------------------------------------------------------------------
          控制流指令
          轉(zhuǎn)移指令(branch)
          說明:無條件轉(zhuǎn)移B,BAL
          舉例: B LABEL ; LABEL為某個位置
          條件轉(zhuǎn)移
          說明: BEQ 相等
          BNE 不等
          BPL 非負
          BMI 負
          BCC 無進位
          BCS 有進位
          BLO 小于(無符號數(shù))
          BHS 大于等于(無符號數(shù))
          BHI 大于(無符號數(shù))
          BLS 小于等于(無符號數(shù))
          BVC 無溢出(有符號數(shù))
          BVS 有溢出(有符號數(shù))
          BGT 大于(有符號數(shù))
          BGE 大于等于(有符號數(shù))
          BLT 小于(有符號數(shù))
          BLE 小于等于(有符號數(shù))
          和其中BCC和BLO,BCS和BHS的二進制代碼相同
          條件執(zhí)行
          說明:有時可以用條件執(zhí)行來代替轉(zhuǎn)移,要使用條件執(zhí)行,要在3字符
          的操作碼之后增加2字符的條件碼,條件碼應(yīng)該在其他任何
          修正碼之前。
          舉例: CMP r0, #5
          ADDNE r1, r1, r0
          SUBNE r1, r1, r2
          ; 在r0!=5的情況下才會執(zhí)行后續(xù)加減語句
          轉(zhuǎn)移和鏈接指令和子程序返回指令
          說明:用于跳轉(zhuǎn)并返回,比如子程序,BL指令,注意不能嵌套子程序,
          否則上一級的返回地址將被下一級的返回地址覆蓋,這時應(yīng)該
          把返回地址和變量保存到堆棧上,使用STMFD和LDMFD
          監(jiān)控程序調(diào)用(略)
          說明:軟中斷相關(guān),可用于提供IO訪問
          跳轉(zhuǎn)表(略)
          說明:用于子程序列表較長時,注意要檢測跳轉(zhuǎn)表越界

          ------------------------------------------------------------------------------
          參考文獻
          《ARM SoC 體系結(jié)構(gòu)》第二版 Steve Furber著


          關(guān)鍵詞: arm指令集匯

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();