Cortex-M內存架構包含16個通用寄存器,其中R0-R12是13個32位的通用寄存器,另外三個寄存器是特殊用途,分別是R13(棧指針),R14(鏈接寄存器),R15(程序計數器)。
對于處理器來說,寄存器可以作為暫存器,存儲臨時結果,也可以作為輸入數據,方便運算,也可以作為索引,去訪問寄存器,其作用各種各樣。
其中R0-R7是低寄存器,因為16位的指令只能訪問他們,而R8-R12是高寄存器,可以被16或32位指令訪問,需要注意的的是,這些通用寄存器在復位后初始值是未定義的,所以在初始前,必須由程序顯式初始化,也可以編寫匯編代碼嵌入代碼段。
R13寄存器—— SP棧指針
它是ARM處理器中最重要的專用寄存器之一,負責管理函數調用和局部變量的內存分配。
我們通常通過PUSH和POP指令訪問棧空間,實現局部變量保存,函數返回地址等信息的管理,從物理機構看,ARM-Cortex-M系列寄存器實際上擁有兩個棧指針,主棧指針 MSP (Main Stack Pointer)和進程指針 PSP(Process Stack Pointer)
MSP (Main Stack Pointer,主棧指針)
用于操作系統內核和異常處理
所有異常模式默認使用MSP
PSP (Process Stack Pointer,進程棧指針)
用于用戶應用程序
在用戶線程模式下使用
?R14—— LR鏈接寄存器
它用于保存函數或者子程序調用返回的地址
在函數或子程序被調用時,調用指令下一條指令的地址被保存到LR寄存器中,這樣,當函數或子程序結束時,處理器可以通過LR寄存器中的值返回到正確的地址繼續執行。
如果函數中調用了函數呢?A函數調用了B函數,B函數還調用了C函數,這時候LR的值會被覆蓋,從而無法再恢復到A函數中繼續運行,所以需要將LR的數值保存到棧中,包括異常處理也是由LR寄存器負責異常處理時的地址返回
為什么不能依賴 LR 本身?
LR 只有一個,但函數調用可以?無限嵌套,必須用棧存儲?調用鏈。
異常/中斷可能在任何時候發生,必須保證 LR 不被意外覆蓋。
遞歸函數?必須保存 LR,否則無法正確返回。
?R15——PC程序計數器
該寄存器的值永遠是下一個執行指令的地址,在ARM架構中,CPU的執行指令包括 取指(Fetch)、譯碼(Decode)和執行(Execute)三個階段,PC在其中承擔關鍵作用,它決定了從哪里取指,控制程序的順序流轉,異常處理和函數跳轉都和PC指針息息相關,