ARM匯編與C語言函數的相互調用及參數傳遞
匯編調用C函數參數傳遞規則
前4個參數通過寄存器 R0
-R3
傳遞,超出部分從右向左壓棧。32位返回值存于 R0
,64位整數用 R0
和 R1
,浮點數通過 S0
/D0
返回。
示例:ARM匯編調用C函數
.global _start
.extern c_function ; 聲明外部C函數_start:MOV R0, #10 ; 參數1MOV R1, #20 ; 參數2BL c_function ; 調用函數B . ; 循環
對應的C函數:
int c_function(int a, int b) {return a + b; // 返回值通過R0返回
}
C調用匯編函數參數傳遞規則
規則與匯編調用C一致,前4個參數使用 R0
-R3
。匯編函數需用 .global
導出。
示例:C調用ARM匯編函數
C代碼聲明:
extern int asm_function(int a, int b);
int main() {asm_function(10, 20); // 調用匯編函數return 0;
}
匯編實現:
.global asm_function
asm_function:ADD R0, R0, R1 ; R0 = a + bBX LR ; 返回
關鍵注意事項
- 若修改
R4
-R11
,需在匯編中壓棧保存。 BL
指令自動保存返回地址到LR
(R14)。
ARM內核異常類型及工作模式切換
異常類型與對應模式
異常類型 | 觸發條件 | 進入模式 | 優先級 |
---|---|---|---|
復位(Reset) | 上電或硬件復位 | 管理模式(SVC) | 1 |
數據中止(Data Abort) | 非法內存訪問(如缺頁) | 中止模式(ABT) | 2 |
快速中斷(FIQ) | 高優先級外設中斷(如DMA) | FIQ模式 | 3 |
普通中斷(IRQ) | 常規外設中斷(如定時器) | IRQ模式 | 4 |
預取中止(Prefetch Abort) | 指令預取失敗 | 中止模式(ABT) | 5 |
軟件中斷(SWI/SVC) | SVC 指令觸發(系統調用) | 管理模式(SVC) | 6 |
未定義指令 | 執行未知指令 | 未定義模式(UND) | 7 |
關鍵機制
- 異常向量表:固定入口地址(如復位地址為
0x00000000
)。 - 模式切換:異常觸發時自動切換模式,保存
CPSR
到SPSR
。 - 寄存器組:不同模式擁有獨立的
SP
(R13)和LR
(R14)。
IRQ處理示例
IRQ_Handler:SUB LR, LR, #4 ; 修正返回地址(PC+4)PUSH {R0-R12, LR} ; 保存寄存器現場BL C_IRQ_Handler ; 調用C處理函數POP {R0-R12, PC}^ ; 恢復現場并返回(^恢復CPSR)
注意事項
- FIQ模式有專用寄存器(
R8
-R12
),可減少保存開銷。 - 復位異常不返回,直接初始化系統。
- 中止異常需處理內存錯誤后重新執行指令。
總結
- ARM與C交互:嚴格遵循ATPCS規范,參數通過寄存器和棧傳遞,返回值使用
R0
。 - 異常處理:7種異常對應不同特權模式,通過向量表跳轉,優先級固定。