arm汇编中不能使用,不能对r13操作的问题

chinaye1 2010-10-14 11:38:10
汇编源代码,实现fft计算
http://read.pudn.com/downloads88/sourcecode/embed/337426/arm_fft/src/ffts.s__.htm

以前也是这样使用的,且使用正常,代码相同,好像与传入这函数的参数无关,主要是在这里突然出现使用r13就data abort了

反汇编代码(部分)如下

320289a4 [0xe28aa00c] add r10,r10,#0xc
320289a8 [0xe8aa00f8] stmia r10!,{r3-r7}
320289ac [0xe89a33f0] ldmia r10,{r4-r9,r12,r13}-这句出现data abort异常 把r13去掉后正常
320289b0 [0xe0844006] add r4,r4,r6
320289b4 [0xe0855007] add r5,r5,r7
320289b8 [0xe0446086] sub r6,r4,r6,lsl #1
320289bc [0xe0457087] sub r7,r5,r7,lsl #1
320289c0 [0xe088800c] add r8,r8,r12
320289c4 [0xe089900d] add r9,r9,r13-这句没事
320289c8 [0xe049308d] sub r3,r9,r13,lsl #1
320289cc [0xe048c08c] sub r12,r8,r12,lsl #1
320289d0 [0xe0844008] add r4,r4,r8
320289d4 [0xe0855009] add r5,r5,r9
320289d8 [0xe0448088] sub r8,r4,r8,lsl #1
320289dc [0xe0459089] sub r9,r5,r9,lsl #1
320289e0 [0xe0866003] add r6,r6,r3
320289e4 [0xe047700c] sub r7,r7,r12
320289e8 [0xe087d08c] add r13,r7,r12,lsl #1-这句对r13操作的也出现data abort异常
320289ec [0xe046c083] sub r12,r6,r3,lsl #1
320289f0 [0xe28aa010] add r10,r10,#0x10
320289f4 [0xe88a3300] stmia r10,{r8,r9,r12,r13}
320289f8 [0xe51a3024] ldr r3,[r10,#-0x24]
...全文
197 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxxx2967 2010-10-16
  • 打赏
  • 举报
回复
你说的对啊: 这是从r10地址中往{r4-r9,r12,r13}这些寄存器送值的,

这里r10是栈指针。 r13是目标寄存器
jxxx2967 2010-10-16
  • 打赏
  • 举报
回复
你说的对啊,这是从r10所指向的存储器中往寄存器送值。
所以要检查r10所指向的存储器的访问合法性。

data abort 异常就是发生在访问存储器时,访问寄存器肯定不会data abort.
在这条语句中,r10是椎栈指针。
jxxx2967 2010-10-16
  • 打赏
  • 举报
回复
你说的对啊,这是从r10所指向的存储器中往寄存器送值。
所以要检查r10所指向的存储器的访问合法性。

data abort 异常就是发生在访问存储器时,访问寄存器肯定不会data abort.
在这条语句中,r10是椎栈指针。
chinaye1 2010-10-15
  • 打赏
  • 举报
回复
嗯 我也觉得这成熟的程序不会错!r13好像指的是svc堆栈
chinaye1 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jxxx2967 的回复:]

首先,我觉得你的表述是不对的。
r13 只是一个通用寄存器,对它的读写根本不可能引起data abort异常。
引起data abort异常是由于操作了不正确的存储器地址,而不是寄存器。

如果你确定是这句引起的异常
320289ac [0xe89a33f0] ldmia r10,{r4-r9,r12,r13}-这句出现data abort异常 把r13去掉后正常

……
[/Quote]这是从r10地址中往{r4-r9,r12,r13}这些寄存器送值的,不是 要排查一下r10所指向的存储器是否越界 吧?
jxxx2967 2010-10-14
  • 打赏
  • 举报
回复
首先,我觉得你的表述是不对的。
r13 只是一个通用寄存器,对它的读写根本不可能引起data abort异常。
引起data abort异常是由于操作了不正确的存储器地址,而不是寄存器。

如果你确定是这句引起的异常
320289ac [0xe89a33f0] ldmia r10,{r4-r9,r12,r13}-这句出现data abort异常 把r13去掉后正常

你要排查一下r10所指向的存储器是否越界了。

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧