1.5.3_und异常模式程序示例

CPU执行到未定义指令时,会触发未定义指令异常。
在这里插入图片描述
通过异常向量表可以发现,未定义指令异常的入口在0x0000,0004处,即当CPU执行到未定义指令异常时,硬件上CPU就会跳转到0x0000,0004处执行代码。
在这里插入图片描述
我们通过在代码中故意添加一条未定义指令0x0300,00000触发该异常,下图是正常的指令的结构,原图位标反了,左边到右边依次是31-0才对。
在这里插入图片描述
在这里插入图片描述
下表是中断退出和进入的说明表,从下表可以看出,ARM指令下,进入未定义指令异常前,会将PC+4的地址存入R14_x也就是lr_und,所以在退出时只需要将R14_und传给PC即可。
在这里插入图片描述
在处理未定义指令异常时,我们先将r0-r12寄存器的值存入栈中,然后再将lr_异常的值存入栈中,因为这些值有可能被修改,所以要先保存。
在这里插入图片描述
寄存器的功能定义大致如下。
在这里插入图片描述
在这里插入图片描述
保存完现场后,在进行异常处理,在异常处理函数中,我们将cpsr打印出来,同时额外输出一条字符串表示进入的是未定义指令异常。
在这里插入图片描述
这里定义字符串用的是.string指令,它与.ascii指令的区别在于.ascii指令定义的字符串,结尾不会自动加结束符,而.string定义的指令,会自动加入结束符。

下图是处理未定义指令异常的顺序示意图,上电后CPU先从0地址处开始执行,然后将整个代码重定位复制到SDRAM中并跳到SDRAM中执行,检测到未定义指令时触发异常再跳回0x4处,然后在0x4处再跳到SDRAM中处理未定义指令异常。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值