ARM微处理器的编程模型之:异常中断处理
下面的例子显示了如何使用_swi将C函数调用映射到半主机方式的SWI。
#ifdef __thumb
/* Thumb 状态的Semihosting软中断处理*/
#define SemiSWI 0xAB
#else
/* ARM状态下的Semihosting的软中断处理*/
#define SemiSWI 0x123456
#endif
/* 使用Semihosting软中断输出一个字符*/
__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 );
}
编译程序含有一个机制,用以支持使用r12来传递所需运算的值。根据AAPCS标准,r12为IP寄存器,并且专用于函数调用。其他时间内可将其用作暂存寄存器。如前面所述,通用SWI参数和返回值通过r0~r3寄存器传递。而r12可用于传递通用SWI调用的中断功能编号。
下面的例子显示了通用SWI的C语言程序框架。
__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
评论