arm 相關學習(2)

* 六個操作模式

  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)










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章