最近在學習嵌入式底層系統開發,在寫啟動**時要設定各個模式的sp,需要調整cpu的工作模式,部分**如下:
.equ disable_irq, 0x80
.equ disable_fiq, 0x40
.equ sys_mod, 0x1f
.equ irq_mod, 0x12
.equ fiq_mod, 0x11
.equ svc_mod, 0x13
.equ abt_mod, 0x17
.equ und_mod, 0x1b
msr cpsr_c,#(disable_irq|disable_fiq|svc_mod)
ldr sp,=_svc_stack
msr cpsr_c,#(disable_irq|disable_fiq|irq_mod)
ldr sp,=_irq_stack
msr cpsr_c,#(disable_irq|disable_fiq|fiq_mod)
ldr sp,=_fiq_stack
msr cpsr_c,#(disable_irq|disable_fiq|abt_mod)
ldr sp,=_abt_stack
msr cpsr_c,#(disable_irq|disable_fiq|und_mod)
ldr sp,=_und_stack
msr cpsr_c,#(disable_irq|disable_fiq|sys_mod)
ldr sp,=_sys_stack
**中用到了cpsr_c,那麼究竟cpsr_c與cpsr是什麼關係?arm9的每種工作模式除r0~r15共16個暫存器外,還有第17個暫存器cpsr(current program status register),叫做當前程式狀態暫存器,cpsr中一些位被用於標識各種狀態,一些位被用於標識當前出於什麼工作模式。
cpsr有4個8位區域:標誌域(f)、狀態域(s)、擴充套件域(x)、控制域(c)。
在arm 處理器中,只有msr 指令可以直接設定狀態暫存器cpsr或spsr。指令格式如下:
msr psr_fields,#immed_8r(8位立即數)
msr psr_fields,rm
其中: psr 指cpsr 或spsr
fields 指定傳送的區域。fields 可以是以下的一種或多種(字母必須為小寫):
基於ARM9程式狀態暫存器CPSR
定義 程式狀態暫存器 功能 反映資料運算狀態,控制系統模式等 特點 程式狀態暫存器不屬於通用暫存器 關於cpsr的訪問,arm專門為其設立了兩條指令 mrs cpsr到通用暫存器傳遞資料指令 msr 通用暫存器到cprs傳遞資料指令 1 msr 通用暫存器 cpsr 格式 msr 條件 cpsr s...
ARM9暫存器 ARM thumb 過程呼叫標準
根據 arm thumb 過程呼叫標準 1,r0 r3 用作傳入函式引數,傳出函式返回值。在子程式呼叫之間,可以將 r0 r3 用於任何用途。被呼叫函式在返回之前不必恢復 r0 r3。如果呼叫函式需要再次使用 r0 r3 的內容,則它必須保留這些內容。2,r4 r11 被用來存放函式的區域性變數。如...
arm9的操作模式,暫存器,定址方式
a rm有7種工作模式 名稱 簡稱簡介 userusr 正常使用者程式執行的模式 linux 下使用者程式就是在這一模式執行的。fiqf iq快速中斷模式 irqi rq普通中斷模式 supervisorsvc 給作業系統準備的保護模式,許可權很高的一種模式,linux 的核心就是執行在此模式 ab...