1 未定义指令
先看一下ARM中指令的格式:
注意:这个表的最上面的对应的位是从高到低的,所以0Xdeadc0de 就是一条未定义指令(方便易懂)
2 中断向量表
未定义异常,首先要产看中断向量表:
在板子上电之后,CPU从0地址开始执行,首先执行复位Reset操作,而且触发异常之后会跳转至相应的地址去进入异常处理程序,所以我们要在0地址开始按照中断向量表编写相应的异常处理程序的指引,如下:
.text
.global _start
_start:
/* 异常向量表 */
bl reset /* 0X0 Reset 上电复位,从0地址开始执行程序,依次:关闭看门狗、配置时钟系统、初始化sdram、拷贝代码到sdram(重定位)、清除.bcc段、进入mian函数 */
ldr pc, =und_addr /* 0X4 Undefined instruction */
// bl do_swi /* 0X8 Software Interrupt */
// bl do_ap /* 0XC Abort(prefetch) */
// bl do_ad /* 0X10 Abort(data) */
// bl do_re /* 0X14 Reserved */
// bl do_irq /* 0X18 IRQ */
// bl do_fiq /* 0X1C FIQ */
3 设置一个未定义指令
人为引入一个未定义指令,如果遇到未定义的指令的时候,比如如下的指令0Xeeadc0de:(改正:将0Xdeadc0de改为0Xeeadc0de,因为0Xdeadc0de实际上是一条 条件执行语句,只有触发条件才会执行下面的代码)
CPU执行到这里就会取指令,发现这是一个未定义指令,就会自动触发und异常,CPU就会在中断向量表中找到und的处理程序地址映射,通过跳转指令去执行und的处理程序。
4 调用C函数
und的处理函数可以用C语言写好,在汇编中调用即可,不过要注意参数的传递:
C函数如示:
void Und_Process( unsigned int cpsr )
{
puts