问题描述
.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
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 指令可以访问“未对齐的地址”。
看看这里: