微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

抛出数据中止异常

如何解决抛出数据中止异常

我正在 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]

这是为什么,我该如何解决

解决方法

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

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

R0 包含奇数。

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

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

恩里科·米格里奥

附言

CPU 只能访问:“对齐的内存地址”,根据 CPU 类型,这些地址甚至是 4 或 8 的倍数。

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

看看这里:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。