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]
...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用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所指向的存储器是否越界了。
1、 ARM微处理器有 7种工作模式,它们分为两类 非特权模式 、 特权模式 。其用户模式属于 非特权模式 2、 ARM支持两个指令集, ARM核因运行的指令集不同,分别有两个状态 ARM 、 Thumb ,状态寄存器CPSR的 T 位反映了处理器运行不同指令的当前状态 3、 ARM核有多个寄存器,其大部分用于通用寄存器,有小部分作为专用寄存器, R15 寄存器用于存储PC,R13通常用来存储 SP 4、 ARM处理器有两种总线架构,数据和指令使用同一接口的是 冯诺依曼 ,数据和指令分开使用不同接口的是 哈佛结构 1. 下列不是嵌入式系统特点的是: A. 系统内核小 B. 专用性强 C. 系统精简 D. 实时性要求不高 2. 关于ARM汇编和C语言混合编程下列错误的是: A.C语言可以直接嵌入某些汇编指令 B. C语言可以调用汇编的子程序 C. 汇编程序可以调用C语言的函数 D. C语言嵌入的汇编指令时,不可以使用C的变量 3. 关于ATPCS规则,说法错误的是: A. 只能使用R0-R3来传递参数 B. R13为堆栈指针SP,需要保护 C. R14为连接寄存器,用于存放程序返回地址 D. 单字的返回值存放在R0 4. 关于交叉编译描述正确的是: A. 编译器运行在目标机,生成的可执行文件在宿主机上运行 B.编译器运行在宿主机,生成的可执行文件在宿主机上运行 C.编译器运行在目标机,生成的可执行文件在目标机上运行 D.编译器运行在宿主机,生成的可执行文件在目标机上运行 5. 建立嵌入式Linux开发环境使用Bootp协议的直接目的是: A. 分配宿主机的IP地址 B. 分配目标机的IP地址 C. 用于宿主机和目标机之间通讯 D. 用于监控目标机的运行。
嵌入式实验报告全文共6页,当前为第1页。嵌入式实验报告全文共6页,当前为第1页。西安电子科技大学 嵌入式实验报告全文共6页,当前为第1页。 嵌入式实验报告全文共6页,当前为第1页。 嵌入式系统 课程实验报告 实验名称 ARM开发基础 成 绩成 绩 ** 学院 1518021 班 成 绩 成 绩 姓名 ** 学号 同作者 无 实验日期 2018 年 6 月 14 日 指导教师评语: 指导教师: 年 月 日 实验目的 初步学会使用 μVision3 IDE for ARM 开发环境及 ARM 软件模拟器; 通过实验掌握简单 ARM 汇编指令的使用方法; 实验内容 熟悉开发环境的使用使用 ldr/str, mov 等指令 学习使用 add/sub/lsl/lsr/and/orr 等指令,完成基本算术/逻辑运算; 设计实现表达式 y=a*8+b/2-c, 并验证之。 嵌入式实验报告全文共6页,当前为第2页。嵌入式实验报告全文共6页,当前为第2页。 嵌入式实验报告全文共6页,当前为第2页。 嵌入式实验报告全文共6页,当前为第2页。 实验原理 ARM9 处理器内核共有 37 个寄存器: 31 个通用寄存器,包括程序计数器(PC)。这些寄存器都是 32 位的; 6 个状态寄存器。这些寄存器也是 32 位的,但是只是使用了其的 12 位。 这里简要介绍通用寄存器,关于状态寄存器的介绍。 1. ARM 通用寄存器 通用寄存器(R0-R15)可分为三类: 不分组寄存器 R0~R7; 分组寄存器 R8~R14; 程序计数器 PC。 (1)不分组寄存器 R0~R7 不分组寄存器 R0~R7 在所有处理器模式下,它们每一个都访问一样的 32 位寄存器。它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。 (2)分组寄存器 R8~R14 分组寄存器 R8~R14 对应的物理寄存器取决于当前的处理器模式。若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。 寄存器 R8~R12 各有两组物理寄存器:一组为 FIQ 模式,另一组为除了 FIQ 以外的所有模式。寄存器 R8~R12 没有任何指定的特殊用途,只是在作快速断处理时使用。寄存器 R13, R14 各对应 6 个分组的物理寄存器, 1 个用于用户模式和系统模式,其它 5 个分别用于 5 种异常模式。寄存器 R13 通常用做堆栈指针,称为SP;寄存器 R14 用作子程序链接寄存器,也称为 LR。 嵌入式实验报告全文共6页,当前为第3页。嵌入式实验报告全文共6页,当前为第3页。 (3)程序计数器 PC 寄存器 R15 用做程序计数器 (PC)。 在本实验ARM 核工作在用户模式, R0~R15 可用。 2.存储器格式 ARM 体系结构将存储器看作是从零地址开始的字节的线性组合。字节零到字 节三放置第一个字(WORD),字节四到字节七存储第二个字,以此类推。 ARM 体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。 大端格式 在这种格式,字数据的高位字节存储在低地址,而字数据的低位字节则存放在高地址,如图 4-1 所示。 嵌入式实验报告全文共6页,当前为第3页。 嵌入式实验报告全文共6页,当前为第3页。 小端格式 嵌入式实验报告全文共6页,当前为第4页。嵌入式实验报告全文共6页,当前为第4页。在这种格式,字数据的高位字节存储在高地址,而字数据的低位字节则存放在低地址,如图 4-2 所示。 3. Realview 基础知识 μVision3 IDE 集成了 REALVIEW 汇编器 AARM、编译器 CARM、链接器LARM,若采用 GNU 编译器则需要下载安装相应的工具包。本书所有例程代码均按照 REALVIEW 的语法和规则来书写。关于AARM、 CARM 和 LARM 的规范和具体使用,可参照 μVision3 IDE 所带的帮助文档,在此不再赘述。 嵌入式实验报告全文共6页,当前为第4页。 嵌入式实验报告全文共6页,当前为第4页。 实验步骤 拷贝整个实验例程源码目录到本地磁盘自己的工作目录下; 2) 使用 μVision IDE for ARM 通过 ULINK2 仿真器连接实验板,打开实验例程目录 ARM 体系\1.1_asm1 子目录下的 asm_1a.Uv2 例程,编译链接工程; 3)该工程配置为在模拟器运行。可以通看工程属性查看:菜单"Project""Options for Target Asm1",在弹出的对话框点击"Debug": 可以看到选择为"Use Simulator", 在 Debug 选项页内设置了一个初始化文件:DebugINRam.ini。此.INI 文件用于设置生成的.AXF 文件下载到目标的位置,以及调试

21,595

社区成员

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

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