arm指令集 從匯編開始
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(進位)、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 非負(fù)
BMI 負(fù)
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著
評論