<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(負(fù)數(shù))、Z(零)、 C(進(jìn)位)、V(溢出)標(biāo)志

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

          ------------------------------------------------------------------------------
          數(shù)據(jù)處理指令:對寄存器內(nèi)數(shù)據(jù)進(jìn)行算術(shù)或邏輯操作
          簡單寄存器操作
          算術(shù)操作: ADD, ADC, SUB, SBC, RSB, RSC
          說明: RSB和RSC分別為反向減法和帶進(jìn)位反向減法
          舉例: 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進(jìn)制立即數(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 非負(fù)
          BMI 負(fù)
          BCC 無進(jìn)位
          BCS 有進(jìn)位
          BLO 小于(無符號數(shù))
          BHS 大于等于(無符號數(shù))
          BHI 大于(無符號數(shù))
          BLS 小于等于(無符號數(shù))
          BVC 無溢出(有符號數(shù))
          BVS 有溢出(有符號數(shù))
          BGT 大于(有符號數(shù))
          BGE 大于等于(有符號數(shù))
          BLT 小于(有符號數(shù))
          BLE 小于等于(有符號數(shù))
          和其中BCC和BLO,BCS和BHS的二進(jìn)制代碼相同
          條件執(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)表越界

          ------------------------------------------------------------------------------
          參考文獻(xià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); })();