色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

          arm指令集 從匯編開(kāi)始

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

          自動(dòng)變址功能

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

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

          ------------------------------------------------------------------------------
          數(shù)據(jù)處理指令:對(duì)寄存器內(nèi)數(shù)據(jù)進(jìn)行算術(shù)或邏輯操作
          簡(jiǎn)單寄存器操作
          算術(shù)操作: ADD, ADC, SUB, SBC, RSB, RSC
          說(shuō)明: RSB和RSC分別為反向減法和帶進(jìn)位反向減法
          舉例: ADD r0, r1, r2 ; r0 = r1 + r2
          RSB r0, r1, r2 ; r0 = r2 - r1
          按位邏輯操作: AND,ORR,EOR,BIC
          說(shuō)明:按位與,按位或,按位異或,and not
          舉例: BIC r0, r1, r2 ; r0 = r1 and not r2
          寄存器傳送操作:MOV,MVN
          說(shuō)明: MVN為按位取反傳送
          舉例: MVN r0, r2 ; r0 = not r2
          比較操作:CMP,CMN,TST,TEQ
          說(shuō)明: 比較,取反比較,位測(cè)試,測(cè)試相等
          舉例: TEQ r1, r2 ;
          注意:操作數(shù)順序格式為結(jié)果寄存器,第一操作數(shù),第二操作數(shù)
          立即數(shù)操作:
          說(shuō)明: 在數(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
          說(shuō)明: 邏輯左移,邏輯右移,算術(shù)左移,算術(shù)右移,循環(huán)右移,擴(kuò)展
          一位的循環(huán)右移
          舉例: ADD r3, r2, r1, LSL #3 ; r3 = r2 + (r1 << 3)
          設(shè)置條件碼:
          說(shuō)明:任何數(shù)據(jù)處理指令都可以設(shè)置條件碼(NZCV),比較操作只能設(shè)
          置條件碼,如果其他數(shù)據(jù)處理操作要設(shè)置條件碼,需要增加S
          操作碼來(lái)指明。
          算術(shù)操作(包括CMP,CMN)根據(jù)算術(shù)運(yùn)算結(jié)果來(lái)設(shè)置所有標(biāo)志
          位,邏輯和傳送操作不產(chǎn)生有意義的C或V值,這些操作根據(jù)結(jié)
          果來(lái)設(shè)置N和Z,保留V,沒(méi)有移位操作時(shí),保留C;或者當(dāng)移位
          時(shí),將移位移出的最后位設(shè)置為C。
          舉例: ADDS r2, r2, r0
          ADC r3, r3, r1
          乘法操作:
          說(shuō)明: 第二操作數(shù)不可以為立即數(shù)
          結(jié)果寄存器不允許為源寄存器
          如果設(shè)置位S,則標(biāo)志位V保留,標(biāo)志為C不再有意義。
          長(zhǎng)乘的話,高32位有效位放入第二個(gè)結(jié)果寄存器。
          舉例: MUL r4, r3, r3 ; r4 = r3 * r2
          MLA r4, r3, r2, r1 ; r4 = r3 * r2 + r1

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

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

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

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

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


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

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉