注意:除user(使用者模式)是normal(普通模式)外,其他6種都是privilege(特權模式)。 privilege中除sys模式外,其餘5種為異常模式。 各種模式的切換,可以是程式設計師通過**主動切換(通過寫cpsr暫存器);也可以是cpu在某些情況下自動切換。 各種模式下許可權和可以訪問的暫存器不同。
非特權模式:
特權模式:
irqsvc
abort
udef
monitor
arm共有37個暫存器,都是32位長度 37個暫存器中30個為「通用」型,1個固定用作pc,乙個固定用作cpsr,5個固定用作5種異常模式下的spsr。
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中斷可以不用只存放位址,而是把整個異常處理程式放進去,這樣就少跳轉了一次,加快了中斷相應速度。
ARM的37個暫存器以及異常處理方法
注意 除user 使用者模式 是normal 普通模式 外,其他6種都是privilege 特權模式 privilege中除sys模式外,其餘5種為異常模式。各種模式的切換,可以是程式設計師通過 主動切換 通過寫cpsr暫存器 也可以是cpu在某些情況下自動切換。各種模式下許可權和可以訪問的暫存器不...
ARM的37個暫存器詳解
arm共有37個暫存器,都是32位長度 37個暫存器中30個為 通用 型,1個固定用作pc,乙個固定用作cpsr,5個固定用作5種異常模式下的spsr。注意 system模式使用user模式暫存器。當arm從使用者模式 user 切換到快速中斷模式 fiq 暫存器r0 r7,r15是不變的,fiq的...
ARM程式設計 關於ARM暫存器的巨集定義
arm程式設計 關於arm暫存器的巨集定義 gf86530430 136次 2008 8 27 請問各位大蝦 在arm的標頭檔案裡,對與暫存器的定義為什麼不跟51的一樣?如下 define rutxh0 volatile unsigned char 0x1d00020 define rutxh1 v...