4.2 编制软中断程序
SWI指令用于产生软中断,从而实现在从户模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。在其他模式下也可使用SWI指令,处理器同样地切换到管理模式。
SWI{cond} immed_24 指令举例如下:
SWI 0 ;软中断,中断立即数为0
SWI 0xl23456 ;软中断,中断立即数为0xl23456
使用SWI指令时,通常使用以下两种方法进行传递参数,SWI异常中断处理程序就可以提供相关的服务。
这两种方法均由用户软件协定。
SWI异常中断处理程序要通过读取引起软中断的SWI指令,以取得24位立即数。
指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。
MOV R0,#34 ;设置子功能号为34
SWI 12 ;调用12号软中断
指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其他的通用寄存器传递。
MOV R0,#12 ;调用12号软中断
MOV R1,#34 ;设置子功能号为34
SWI 0
在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为:
首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;
然后取得该SWI指令的地址,这可通过访问LR寄存器得到;
接着读出该SWI指令,分解出立即数。
SWI_Handler
STMFD SP!,{R0-R3,R12,LR} ;现场保护
MRS R0,SPSR ;读取SPSR
STMFD SP!,{R0} ;保存SPSR
TST R0,#0x20 ;测试T标志位
LDRNEH R0,[LR,#-2] ;若是Thumb指令,读取指令码(16位)
BICNE R0,R0,#0xFF00 ;取得Thumb指令的8位立即数
LDREQ R0,[LR,#-4] ;若是ARM指令,读取指令码(32位)
BICEQ R0,R0,#0xFF000000 ;取得ARM指令的24位立即数
……
LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中断返回
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。