Cortex_M3通用寄存器组特殊功能寄存器功能简介及汇编用法
通用寄存器組:
CM3 擁有通用寄存器 R0-R15 以及一些特殊功能寄存器。 R0-R12 是最“通用目的”的,但是絕大多數(shù)的 16 位指令只能使用 R0-R7(低組寄存器),而 32 位的 Thumb-2 指令則可以訪問所有通用寄存器。特殊功能寄存器有預定義的功能,而且必須通過專用的指令來訪問。
RO–R12為32位的通用寄存器;
絕大多數(shù)的 16 位指令只能使用 R0-R7(低組寄存器),而 32 位的 Thumb-2 指令則可以訪問所有通用寄存器。
R0-R7 也被稱為低組寄存器。所有指令都能訪問它們。它們的字長全是 32 位,復位后的初始值是不可預料的;
R8-R12 也被稱為高組寄存器。這是因為只有很少的 16 位 Thumb 指令能訪問它們, 32 位的thumb-2 指令則不受限制。它們也是 32 位字長,且復位后的初始值是不可預料的。
R13位堆棧指針寄存器SP,R13有兩個堆棧指針,任何時候都只能用到一個;
主堆棧指針(MSP):復位后缺省使用的堆棧指針,用于操作系統(tǒng)內(nèi)核以及異常處理例程(包括中斷服務例程)
進程堆棧指針(PSP):由用戶的應用程序代碼使用。(堆棧指針的最低兩位永遠是 0,這意味著堆棧總是 4 字節(jié)對齊的。他們的地址必 須是0x4,0x8,0xc,……)
堆棧指針用于訪問堆棧,訪問堆棧只需要兩條指令,PUSH核POP,并且 PUSH 指令和 POP 指令默認使用 SP。通常在進入一個子程序后,第一件事就是把寄存器的值先 PUSH 入堆棧中,在子程序退出前再 POP 曾經(jīng) PUSH 的那些寄存器。其匯編語言語法如下例所示;
PUSH 和 POP 還能一次操作多個寄存器,如下所示:
subroutine_1 PUSH {R0-R7, R12, R14} ; 保存寄存器列表 … ; 執(zhí)行處理 POP {R0-R7, R12, R14} ; 恢復寄存器列表 BX R14 ; 返回到主調(diào)函數(shù)R14:連接寄存器LR;
跳轉(zhuǎn)到一個子程序時,由 R14 ,也就是LR寄存器來存儲返回地址;其匯編用法如下:
R15:程序計數(shù)寄存器;
也叫PC指針寄存器,用于指向下一條指令的地址,確保程序有序的執(zhí)行,CM3 內(nèi)部使用了指令流水線,讀 PC 時返回的值是當前指令的地址+4。如:
特殊功能寄存器–必須通過專用的指令來訪問
狀態(tài)寄存器xPSR
記錄 ALU 標志(0 標志,進位標志,負數(shù)標志,溢出標志),執(zhí)行狀態(tài),以及當前正服務的中斷號,程序狀態(tài)寄存器在其內(nèi)部又被分為三個子狀態(tài)寄存器:
1.應用程序 PSR(APSR)
2. 中斷號 PSR(IPSR)
3. 執(zhí)行 PSR(EPSR)
通過 MRS/MSR 指令,可對這 3 個 寄存器即可以單獨訪問,也可以組合訪問(2 個組合, 3 個組合都可以)。如下圖所示:
中斷屏蔽寄存器
有3個寄存器,分別是PRIMASK, FAULTMASK 和 BASEPRI,用于控制異常的使能和除能,只有在特權(quán)級下,才允許訪問這 3 個寄存器。
1.PRIMASK
這是個只有單一比特的寄存器。 在它被置 1 后,就關(guān)掉所有可屏蔽的異常,只剩下 NMI 和硬 fault 可以響應。它的缺省值是 0,表示沒有關(guān)中斷
2.FAULTMASK
這是個只有 1 個位的寄存器。當它置 1 時,只有 NMI 才能響應,所有其它的異常,甚至是硬 fault,也通通閉嘴。它的缺省值也是 0,表示沒有關(guān)異常。
3.BASEPRI
這個寄存器最多有 9 位(由表達優(yōu)先級的位數(shù)決定)。它定義了被屏蔽優(yōu)先級的閾值。當它被設成某個值后,所有優(yōu)先級號大于等于此值的中斷都被關(guān)(優(yōu)先級號越大,優(yōu)先級越低)。但若被設成 0,則不關(guān)閉任何中斷, 0 也是缺省值。
要訪問 PRIMASK, FAULTMASK 以及 BASEPRI,要使用 MRS/MSR 指令,如下所示:
MRS R0, BASEPRI ;讀取 BASEPRI 到 R0 中 MRS R0, FAULTMASK ;似上 MRS R0, PRIMASK ;似上 MSR BASEPRI, R0 ;寫入 R0 到 BASEPRI 中 MSR FAULTMASK, R0 ;似上 MSR PRIMASK, R0 ;似上控制寄存器(CONTROL)
控制寄存器有兩個用途,其一用于定義特權(quán)級別,其二用于選擇當前使用哪個堆棧指針。由兩個比特來行使這兩個職能
CONTROL[1]–堆棧指針選擇:
0=選擇主堆棧指針 MSP(復位后的缺省值)
1=選擇進程堆棧指針 PSP
在 Cortex-M3 的 handler 模式中,只允許使用 MSP,所以此時不得往該位寫 1, CONTROL[1]總是 0。在線程模式中則可以為 0 或 1。
CONTROL[0] :
0=特權(quán)級的線程模式
1=用戶級的線程模式
僅當在特權(quán)級下操作時才允許寫該位。一旦進入了用戶級,唯一返回特權(quán)級的途徑,就是觸發(fā)一個(軟)中斷,再由服務例程改寫(Handler 模式永遠都是特權(quán)級的)。CONTROL 寄存器也是通過 MRS 和 MSR 指令來操作的:
總結(jié)
以上是生活随笔為你收集整理的Cortex_M3通用寄存器组特殊功能寄存器功能简介及汇编用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WIN10远程桌面连接发生身份验证错误(
- 下一篇: bugku web题 33-40 wp