为了测试arm的 data abort 異常,寫了如下代码,故意访问1M意外沒有被映射的區域:
00000000 ldr sp, =0x100000
00000004 add sp, sp, #8
00000008 push {r0} /* access un-mapped area, cause Data abort exception */
0000000C push {r1}
00000010 ............
復制代碼
异常响應代碼如下:
dabort_handler:
sub lr, lr, 8
ldr r0, =str_dabort
mov r1, lr
bl printf
.....
str_dabort:
.string "Data abort exception, LR = 0x%x\r\n"
复制代碼
测试得到的打印信息:
Data abort exception, LR = 0x100000
按照书上讲的,LR_abt 应该保存导致data abort异常的那条指令地址才对,但这里为什么是 0x100000 而不是 0x0000008 呢?
--------------------------
其实LR是没有问题的,最后发现是自定义函数printf里面有bug導致的。
|