ARM微處理器的編程模型之:異常中斷處理
下面的例子顯示了如何使用_swi將C函數(shù)調(diào)用映射到半主機(jī)方式的SWI。
#ifdef __thumb
/* Thumb 狀態(tài)的Semihosting軟中斷處理*/
#define SemiSWI 0xAB
#else
/* ARM狀態(tài)下的Semihosting的軟中斷處理*/
#define SemiSWI 0x123456
#endif
/* 使用Semihosting軟中斷輸出一個(gè)字符*/
__swi(SemiSWI) void Semihosting(unsigned op, char *c);
#define WriteC(c) Semihosting (0x3,c)
void write_a_character(int ch)
{
char tempch = ch;
WriteC( tempch );
}
編譯程序含有一個(gè)機(jī)制,用以支持使用r12來(lái)傳遞所需運(yùn)算的值。根據(jù)AAPCS標(biāo)準(zhǔn),r12為IP寄存器,并且專用于函數(shù)調(diào)用。其他時(shí)間內(nèi)可將其用作暫存寄存器。如前面所述,通用SWI參數(shù)和返回值通過(guò)r0~r3寄存器傳遞。而r12可用于傳遞通用SWI調(diào)用的中斷功能編號(hào)。
下面的例子顯示了通用SWI的C語(yǔ)言程序框架。
__swi_indirect(0x80)
unsigned SWI_ManipulateObject(unsigned operationNumber,
unsigned object,unsigned parameter);
unsigned DoSelectedManipulation(unsigned object,
unsigned parameter, unsigned operation)
{
return SWI_ManipulateObject(operation, object, parameter);
}
生成的匯編代碼如下。
DoSelectedManipulation PROC
STMFD sp!,{r3,lr}
MOV r12,r2
SWI 0x80
LDMFD sp!,{r3,pc}
ENDP
評(píng)論