ARM的37個寄存器以及異常處理方法


ARM 有7個基本工作模式

  • User : 非特權模式,大部分任務執行在這種模式
  • FIQ : 當一個高優先級(fast) 中斷產生時將會進入這種模式
  • IRQ : 當一個低優先級(normal) 中斷產生時將會進入這種模式
  • Supervisor :當復位或軟中斷指令執行時將會進入這種模式
  • Abort : 當存取異常時將會進入這種模式
  • Undef : 當執行未定義指令時會進入這種模式
  • System : 使用和User模式相同寄存器集的特權模式

注意:除User(用戶模式)是Normal(普通模式)外,其他6種都是Privilege(特權模式)。 Privilege中除Sys模式外,其余5種為異常模式。 各種模式的切換,可以是程序員通過代碼主動切換(通過寫CPSR寄存器);也可以是CPU在某些情況下自動切換。 各種模式下權限和可以訪問的寄存器不同。

非特權模式:

  • User

特權模式:

  • 異常模式:FIQ

         IRQ

         Svc

              Abort

              Udef

  • 非異常模式:System

                Monitor

ARM寄存器分析

ARM共有37個寄存器,都是32位長度 37個寄存器中30個為“通用”型,1個固定用作PC,一個固定用作CPSR,5個固定用作5種異常模式下的SPSR。

  • r13(sp)用作堆棧可以保存上下文,便於以后跳轉回來能繼續執行
  • r14(lr)用於存儲返回地址,當我們返回原模式可以bl lr或者mov pc lr這樣就實現了返回
  • r15(pc):程序指針,PC指向哪里,CPU就會執行哪條指令(所以程序跳轉時就是把目標地址代碼放到PC中)
  • cpsr:中各個bit位表明了cpu的某些狀態信息,這些信息非常重要,和后面學到的匯編指令息息相關(譬如BLE指令中的E就和CPSR中的Z標志位有關) cpsr中的I、F位和開中斷、關中斷有關 cpsr中的mode位(bit4~bit0共5位)決定了CPU的工作模式,在uboot代碼中會使用匯編進行設置。
  • spsr:用來保存cpsr

 

1.條件標志位 

-N: Negative result from ALU

 -Z: Zero result from ALU

 -C: ALU operation Carried out (進位/借位)

 -V: ALU operation overflowed (溢出)

* N=1時,說明運算的結果為負數,N=0時,說明運算的結果為正數或零。

* Z=1時,說明運算的結果為0,Z=0時,說明運算的結果為非0。

* C:

 - 加法運算(包括CMP):當運算結果產生了進位時(無符號數溢出),C=1,否則為0。

 - 減法運算(包括CMP):當運算結果產生了借位時(無符號數溢出),C=0,否則C=1。

 - 對於包含移位操作的非加減指令操作時,C為移除值的最后一位。

 - 對於其它的非加減指令,C的值通常不變。

* V:

 - 對於加減法運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,V=1表示符號位溢出

 - 對於其它的非加減法指令,V的值通常不變。

 

2.Q位:

* 在ARM V5及以上的版本的E系列處理器中,Q標識位指示增強的DSP運算指令是否發生了溢出,在其它版本的處理器中,Q未定義。

 

3.J位:

* 僅ARM 5TE/J 架構支持

* J=1時,處理器處於Jazelle狀態

跳轉過程

異常向量表

所有的CPU都有異常向量表,這是CPU設計時就設定好的,是硬件決定的。 當異常發生時,CPU會自動動作(PC跳轉到異常向量處處理異常,有時伴有一些輔助動作) 異常向量表是硬件向軟件提供的處理異常的支持。

***異常產生時

做好保護現場的工作:

(1)把cpsr保存到spsr中,設置適當的cpsr(改變處理器的ARM狀態、改變處理器進入相應的異常模式、(視情況)改變中斷禁止位禁止相應中斷)

(2)保存返回地址到lr

(3)設置pc為相應的異常向量

實現跳轉。

 

***異常返回時

做好恢復現場工作:

(1)從spsr恢復cpsr

(2)從lr恢復pc

注意:這些操作必須在ARM狀態執行

 

TIPS:

(1)異常向量表中除了FIQ中斷都是4個字節,所以只夠存放一段異常處理程序的代碼的首地址

(2)FIQ中斷為快速中斷,其中一個特殊的地方就體現在他的異常向量表(Vector Table)地址在最后一個,所以它可以存放不止4個字節,這樣的話FIQ中斷可以不用只存放地址,而是把整個異常處理程序放進去,這樣就少跳轉了一次,加快了中斷相應速度。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM