在 ARM Cortex-M 系列單片機中,普通C函數調用的入棧(壓棧)和出棧操作通常由編譯器編譯后生成的代碼管理,而硬件僅負責部分關鍵操作。以下是詳細分析:
1. 函數調用與返回的核心機制
(1) 硬件自動完成的部分
-
返回地址的保存:
當通過BL
(Branch with Link)或BLX
指令調用函數時,**硬件會自動將返回地址(即下一條指令的地址)保存到LR
(Link Register)**中。
例如:BL my_function ; 調用函數,硬件自動將返回地址存入 LR
-
返回地址的恢復:
函數返回時,通過BX LR
或MOV PC, LR
指令,硬件會跳轉回LR
中的地址繼續執行。
(2) 軟件管理的部分
- 寄存器的保存與恢復:
C語言寫的函數調用,如果被調用的函數需要修改某些寄存器(如R4-R11
),編譯器生成的代碼會