现在的位置: 首页 > 综合 > 正文

raised an exception. cause : undefined instruction

2013年01月07日 ⁄ 综合 ⁄ 共 1271字 ⁄ 字号 评论关闭

Arm 汇编中出现的问题
     Arm
汇编程序与 x86 汇编程序差不多。使用” ; ”注释。像 start,loop 之类的顶格写。 ENTRY 示意程序开始, END 示意结束。当然这两个要对齐写。
   
  下面主要介绍我写的第一个 arm 汇编程序吧。它当之无愧是一个难产儿。

《转》Processor <wbr>ARM7TDMI <wbr>raised <wbr>an <wbr>exception.Cause:Undefined <wbr>instruction
   
  我想这个代码一看大家就能看出来是一个新手写出来的。源于那行“ Stop    Stop “。但即使是这样一行代码也是费劲辛苦才产生的。
   
  第一次的 arm 汇编代码中,我并没有加这一行。直接运行程序后,发现报错: Processor ARM7TDMI raised an exception.Cause:Undefined instruction ,单步运行看结果,其实结果已经得到了,可是到最后的时候都会弹出一个报错框,框里面最后一列全都是 Undefined. 这个问题很是费解。但现在我明白了。
   
  为什么会出现这样的问题了?
   
  在多任务操作系统中,程序其实是一个任务,靠系统调度,每个任务其实都是不断循环执行的 。而在嵌入式产品中,程序总是做一个或多个循环,用户关闭了电源才停止运行。而在 Windows 下,你设计的程序不用循环,是因为开发工具给你做了默认的循环程序,而并非不用循环运行。

程序计数器存放的是你下一条指令的地址, cpu 不断地读出指令,解码执行,然后这个值会调整指向已经执行过的指令的下一条指令地址。如果没有循环,程序结束后,它依然会读取下一条指令。可是你的程序已运行结束,没有定义指令供程序计数器读取。这样自然会出现无定义错误。

知道原因后,我想到一个最简单的方法。既然 arm 汇编它自己不会停下来。没有下一条指令的话会报 Undefined ,那我就让它循环。于是就有了上面的代码。即不影响结果。也不报错。可是实际运行完后,程序就不会停,很像是死机。这让我觉得总有些欠缺。
     我看了很多安装文件里面自带的例子。发现大多最后的都有一段:
Stop     MOV r0, #0x18        ; angel_SWIreason_ReportException
         LDR r1, =0x20026     ; ADP_Stopped_ApplicationExit
         SWI 0x123456         
   
  既然是 Stop ,猜测这个应该就是让程序停止的代码了。一问,这三行的确就是用中断把程序给停止运行了。但具体代码的含义也说不上来。继续找资料。终于在一个 arm 技术群里面问到了具体的含义。
     stop
一段是用来是程序退出的,第一个语句“ MOV r0 #0x18 ”将 r0 赋值为 0x18 ,这个立即数对应于宏 angel_SWIreason_ReportException 。表示 r1 中存放的执行状态。语句“ LDR r1 =0x20026 ”将 r1 的值设置成 ADP_Stopped_ApplicationExit ,该宏表示程序正常退出。然后使用 SWI ,语句“ SWI 0x123456 ”结束程序,将 CPU 的控制权交回调试器手中。  
   
  至此一个真正意义上的 arm 汇编程序诞生了

抱歉!评论已关闭.