1.5.3_und异常模式程序示例

2023-11-01 86浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

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中处理未定义指令异常。


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台