首页 百科知识 编制软中断程序

编制软中断程序

时间:2022-10-16 百科知识 版权反馈
【摘要】:SWI指令用于产生软中断,从而实现在从户模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。在其他模式下也可使用SWI指令,处理器同样地切换到管理模式。

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异常中断返回

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈