【问题标题】:Throwing data abort exception抛出数据中止异常
【发布时间】:2021-02-27 09:44:34
【问题描述】:

我在CPULator上调试以下代码

.global _start

_start:
  MOV R4, #0x61
  LDR R0, =freq
  ADD R0, R4
  LDR R2, [R0]
  ADD R2, #1
  STR R2, [R0]

_exit:
  MOV R7, #1
  SWI 0

.data
freq:   .rept 128
      .word 0x00 @ initialise character counts as 0
      .endr

CPULator 控制台出现错误:

0000000c Warning: Memory read of 4 bytes at address 00000089 is misaligned. Throwing data abort exception.

Simulator requested a breakpoint.

第 7 行抛出异常:

LDR R2, [R0]

为什么会这样,我该如何解决?

【问题讨论】:

  • 错误信息告诉你问题出在哪里。代码执行未对齐的加载。这是不允许的。
  • 那么我该如何解决呢?对不起,如果 qs 是基本的,我对 ARM 很陌生
  • 我该如何解决它? - 你能解释一下这段代码你想做什么吗?您真的需要从零数组的偏移量 0x61 加载 32 位字 吗?增加它并保存回来?如果不知道代码应该做什么,我们就无能为力了。
  • @CrissHills 重写代码,使其不会尝试访问未对齐地址的内存。如果您提供更详细的问题描述,包括您尝试做什么,我可以提供更具体的帮助。

标签: linux debugging assembly arm memory-alignment


【解决方案1】:

CPU 正在尝试访问内存的奇数地址。

LDR R2, [R0] --> 用R0引用的内存地址的内容加载R2

R0 包含奇数。

所有 32 位和 64 位 CPU 都可以访问内存的偶数地址:

0x00000000 很好 0x00000004 好 0x00000008 好 0x00000009不好

恩里科·米廖雷

附言

CPU 只能访问:“对齐的内存地址”,它是 4 或 8 的倍数,具体取决于 CPU 类型。

少数特殊的 ARM 指令可以访问“未对齐地址”。

看看这里:

https://community.arm.com/developer/tools-software/oss-platforms/f/dev-platforms-forum/8806/loads-and-stores-for-unaligned-memory-addresses

【讨论】:

  • ARM 没有未对齐内存访问的指令。 ARM 芯片要么支持未对齐的内存访问(在这种情况下,可以使用除少数特殊的所有加载/存储之外的所有加载/存储),要么不支持(在这种情况下,它们都不能使用)。您链接的帖子甚至说。请注意,ARMv8 和一些 ARMv7 部件确实支持未对齐的内存访问。
  • 在.data之后添加.align 8或类似的东西;你应该在答案中给出伪操作。
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多