* 六個操作模式
User Mode --- 用戶模式,大部分任務在此模式下運行
FIQ --- 快速中斷模式
IRQ --- 普通中斷模式
Supervisor --- 特權模式,軟件中斷或者復位進入
Abort --- 數據訪問錯誤模式
Undef --- 指令未定義模式
* ARM V4添加第七中模式
System --- 系統特權模式,與user mode使用同樣的寄存器
* 共37個寄存器:
r15 (program counter)
cpsr (current program status register)
spsr (save program status register) 模式切換時保存前一個模式的cpsr.
r0-r7 : 通用未分組寄存器, 共 8 個
r8-r12 : FIQ模式和其他模式兩組, 共10個
r13-r14 : 每種模式各一個, 共2*6 = 12個
spsr : User/System模式沒有spsr. 共5個
r15(pc) : 一個
cpsr : 一個
* 從一個模式A切換到另一個模式B執行的動作:
B[spsr] = A[cpsr]
B[cpsr] 位設置 :
如果A處於thumb狀態, 進入arm狀態
修改Mode[4:0] 位
禁止適當的中斷
B[lr] = A[pc]
B[pc] 設置中斷向量表的值
* 從模式B返回到模式A
A[cpsr] = B[spsr]
A[pc] = B[lr]
所有指令都能訪問 r0-14
大部分指令允許方位 pc
特殊指令允許訪問 CPSR 和SPSR
特權模式使用 load/store指定分組(banked out)的用戶模式寄存器是可能的.
CPSR和SPSR寄存器的31-28bit分別爲: N Z C V
N = ALU結果標記爲負數
Z = ALU結果爲0
C = ALU操作移位溢出(Carried out, 結果大於32bits)
V = ALU操作溢出(Overflowed, 有符號數操作, 結果大於31bits)
CPSR和SPSR寄存器的8-0bit分別爲: I F X T Mode[4:0]
I : 禁止IRQ
F : 禁止FIQ
X : reserved
T : 0 表示 ARM狀態, 1 表示處理器處於Thumb狀態
Mode[4:0] : 定義處理器模式
ARM採用3級流水線操作:
PC ------- FETCH(預取)
PC-4 ------- DECODE(解碼)
PC-8 -------- EXECUTE(執行)
ARM指令的 31-28bit是條件執行, 4位共16種:
0000 = EQ - Z set
0001 = NE - Z clear
0010 = HS/CS - C set(unsigned higher or same)
0011 = LO/CC - C clear (unsigned lower)
0100 = MI - N set (negative)
0101 = PL - N clear(positive or zero)
0110 = VS - V set (overflow)
0111 = VC - V clear(no overflow)
1000 = HI - C set and Z clear (unsigned higher)
1001 = LS - C clear or Z (unsigned lower or same)
1010 = GE - N set and V set, or N clear and V clear ( >=)
1011 = LT - N set and V clear or N clear and V set( > )
1100 = GT - Z clear, and either N set and V set, or N clear and V set(>)
1101 = LE - Z set, or N set and V clear, or N clear and V set (<=)
1110 = AL - always
1111 = Reserved
簡單總結: 無符號數比較: H(大於), L(小於), S(等於). 有符號數比較: G(大於), L(小於), E(等於)
一般數據處理操作不影響cpsr中的條件標誌,爲了更新標誌可在指令後加一個“S“. 例如: adds r0, r1, r2
跳轉指令:
31-28 27-25 24 23 .... 0
cond 1 0 1 L offset
L : 0 = brank; 1 branch with link(bl)
b<l>{<cond>} label
*跳轉指令的的偏移由彙編器計算, 目標地址和跳轉指令間距在減8(流水線)
*偏移是26bit的,因爲最低2位爲0,所以只需寫出高24位
*便宜範圍爲 +/-32Mbytes
注: ARM 4T提供了BX指令切換arm和thumb指令切換
數據處理指令: 算術, 比較, 邏輯, 寄存器間數據移動操作
opcode{<cond>}{S} Rd, Rn, op2
操作數op2有12bits可以使用: 直接使用的話0~4096, 或者使用8bit(0~255) + ROR偶數位(0,2,4....30)
ADD : op1 + op2
ADC : op1 + op2 + carry
SUB : op1 - op2
SBC : op1 - op2 + carry - 1
RSB : op2 - op1
RSC : op2 - op1 + carry - 1
CMP : op1 - op2
CMN : op1 + op2
TST : op1 & op2
TEQ : op1 eor op2
AND : op1 and op2
EOR : op1 eor op2
ORR : op1 or op2
BIC : op1 and (not op2) -- bit clear
MOV : op2
MVN : not op2
op1 總是寄存器Rn
op2 通過移位barrel送到ALU
僞指令ldr可以加載任意32bit數到寄存器
ldr rd, =numeric constant
乘法指令:
mul{<cond>}{S} Rd, Rm, Rs ====> Rd = Rm * Rs
mula{<cond>}{S} Rd, Rm, Rs, Rn ====> Rd = (Rm * Rs) + Rn
mull/mlal : 給出兩個寄存器存放結果
umull/umlal : 無符號乘法
smull/smlal : 有符號乘法
Rd 和 Rm不能是同一個寄存器
加載/存儲指令:
ldr/str/ldm/stm/swp
ldrb/strb : 單字節操作
ldrh/strh : 半字操作
ldrsb/ldrsh : 加載值並擴展符號位到32bits
例子: pre-index
str r0, [r1, #12] ===> [r1 + 12] := r0
str r0, [r1, #12]! ===> [r1 + 12] := r0, r1 := r1 + 12
str r0, [r1, r2, lsl #2] ===> [r1 + r2<<2] := r0
post-index(不用加”!“) :
str r0, [r1], #12 ====> [r1] := r0, r1 := r1 + 12
ARM可以設置大端或者小端訪問數據:
小端 : 低字節存放bit0~7
大端 : 低字節存放bit24~31
多寄存器加載/存儲指令:
31-28 27-25 24 23 22 21 20 19-16 15 ............ 0
cond 1 0 1 P U S W L Rn register list
P : Pre/Post indexing bit, 0 = post, add offset after transfer 1= pre, add offset befor transfer
U : Up/Down bit, 0 = Down, subtract offset from base, 1 = Up, add offset to base
S : PSR and force use bit, 0 = don't load PSR or force user mode, Load PSR or force user mode
ldmfd sp!, {r0-r12,pc}^ ===> ! : 表示W爲, ^ : 表示S位,傳送PC的同時把SPSR寫到CPSR中
W : Write-back bit, 0 = no write-back, 1 = write address into base
L : Load/Store bit, 0 = store to memory, 1 = load from memory
register list : 一個bit代表一個寄存器, 1 代表相應寄存器需傳送
stmfd/ldmfd : full descending stack
stmfa/ldmfa : full ascending stack
stmed/ldmed : empty descending stack
stmea/ldmea : empty ascending stack
注: arm編譯器總是使用滿遞減棧(stmfd/ldmfd)
數據交換指令: 原子操作指令集
swp{<cond>}{B} Rd, Rm, [Rn]
Rd = [Rn], [Rn] = Rm
軟中斷指令:
31-28 27 - 24 23 ......................................................... 0
cond 1 1 1 1 Comment filed(ignore by processor)
PSR傳送指令:
MRS{<cond>} Rd, <psr> ===> Rd = <psr>
MSR{<cond>} <psr>, Rm ===> <psr> = Rm
MSR{<cond>} <psrf>, Rm ===> <psrf> = Rm
其中 <psr> = CPSR, CPSR_all, SPSR or SPSR_all
<psrf> = CPSR_flg or SPSR_flg
* 用戶模式,所有的位都可以讀,但是隻有標誌位可以寫
*ARM體系結構支持16個協處理器,可分三類型協處理器指令:
- 協處理器數據處理
- 協處理器數據傳送(to/from ARM)
- 協處理器內存傳送(load/store to /from memory)
協處理器可以使用硬件/軟件(未定義指令異常)來提供.
CDP {<cond>} <cp_num>, <opc_1>, CRd, CRn, CRm, {opc_2}
31-28 27-24 23-20 19-16 15-12 11-8 7-5 4 3-0
cond 1 1 1 0 opc_1 CRn CRd cp_num opc_2 0 CRm
opc_1 : opcode 操作符
opc_2 : opcode 第二個操作符
CRd : 目的寄存器
CRn, CRm : 源寄存器
MCR : 從協處理器取數據到寄存器
MCR : 從寄存器搬運數據到協處理器
<MRC|MCR> {<cond>} <cp_num>, <opc_1>, Rd, CRn, CRm, <opc_2>
31-28 27-24 23-21 20 19-16 15-12 11-8 7-5 4 3-0
cond 1110 opc_1 L CRn Rd cp_num opc_2 1 CRm
L : 0=從協處理器傳送到ARM or ...
從內存到協處理器
<LDC|STC>{<cond>} {<L>} <cp_num>, CRd, <address>
<LDC|STC>{<cond>} {<L>} <cp_num>, CRd, [Rn, offset] {!}
<LDC|STC>{<cond>} {<L>} <cp_num>, CRd, <[Rn], offset>
L : 表示long長傳送(N=1), 否則short短傳送(N=0)