ARM ALP调试时出现00080000H地址预取中止错误是什么原因?
错误产生原因
- 你代码里的
END是汇编伪指令,作用仅为告知汇编器源代码编译到此结束,不是让CPU停止执行的有效指令。 - 当
MOV r1,#5、MOV r2,#6、ADD r3,r1,r2三条指令执行完成后,CPU会继续按照程序计数器PC的指向,读取后续内存地址的内容作为指令执行。你编写的程序没有覆盖后续地址空间,这些地址要么存储的是无效的乱码数据,要么是未被内存映射的非法区域,CPU尝试读取这些位置的内容作为ARM指令执行时,就会触发Prefetch Abort(预取中止)异常。 - 你可以观测到r3寄存器的运算结果正确,也印证了前三条指令已经正常执行完成,报错是指令执行完后CPU继续跑飞导致的。
修复方法
在最后一条运算指令后添加程序终止逻辑即可,嵌入式调试场景下最简单的处理是加死循环让CPU停在当前位置,避免跑飞:
AREA prog,CODE ENTRY l1 MOV r1,#5 MOV r2,#6 ADD r3,r1,r2 B . ; 新增语句:跳转到当前地址,形成死循环 END
如果是运行在Linux用户态的ARM程序,可以调用exit系统调用终止进程:
MOV r7, #1 ; exit系统调用号 MOV r0, #0 ; 传入退出状态码0 SWI 0
内容的提问来源于stack exchange,提问作者Niresh
相关产品推荐
相关产品推荐

