1.5.4_swi异常模式程序示例

上电之后,程序会进行reset,这时会进入svc模式,这是一种特权模式。
在这里插入图片描述
APP运行于usr mode,在该模式下APP访问硬件时,必须切换mode为svc mode,否则会受限。

那么,怎么切换mode呢?我们知道,当发生异常时,比如中断和未定义指令异常,CPU会进入对应的特权模式,在这些模式下可以进入svc mode,但是这些异常都不稳定。所以,我们使用的是swi(software interrupt)异常,通过指令swi #val(使用软中断)来进入svc模式,同时还可以根据#val来判断需要进行什么样的处理。

先从svc模式切换到usr模式:
在这里插入图片描述
然后再通过一条swi指令进入svc模式:
在这里插入图片描述
退出异常时,将lr_svc直接赋给PC即可,所以存lr_svc时直接存就行。
在这里插入图片描述
然后,在svc异常的处理程序中,输出cpsr的值和表示进入swi异常的字符串。这些部分与未定义指令异常的处理没有什么不同。

除了上述这些,还要找到swi指令的val值。我们知道进入svc异常时,lr_svc保存的是cpu下一条要处理的指令的地址,也就是ldr pc, =main的地址。该地址减去4,就是swi 0x123的地址。
在这里插入图片描述
所以我们先将lr的值保存到r4,这是由于中间的printException会进行子程序调用,保存到r4可以保证不会被破坏。然后把r4 - 4得到swi 0x123的地址,赋给r0,然后跳到printSWIVal子程序中去,在这个子程序中再取出#val并输出。
在这里插入图片描述
在这里插入图片描述
根据下图,我们知道swi的后24位被处理器忽略,这应该就是#val
在这里插入图片描述
最终的结果如下图:cpsr的[M4:M0]为0b10011,进入了svc模式,输入的#val也正确。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
当运行与Thumb指令集时,swi指令为16位,这时他的#val只有八位,也就是最后八位。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值