assembly - 什么是非对齐访问? (ARM/凯尔)

标签 assembly arm keil arm7

我正在使用 Keil 为 ARM 7 编写程序集。

我有以下运行时错误:

Non-aligned Access: ARM Instruction at 000000F8H, Memory Access at 7F7F7F7FH
Data Abort: ARM Instruction at 000000F8H, Memory Access at 7F7F7F7FH

这并没有真正帮助我,因为我不知道什么是“非对齐访问”(除了明显的,但我并不真正理解它的含义)并且我正在尝试访问(存储)以0x7F7F7F7F ,有什么问题吗?

搜索我只发现了几个类似的问题,都使用 C,并通过某种方式解决了非常特定于他们的代码并且与此问题无关的问题。

我正在做:
LDR R0, =0x7F7F7F7F
LDR R1, LABEL
STR R1, [R0]

然后我用不同的标签和 R0 的偏移量做类似的事情。 ,但它首先在这里失败。

最佳答案

问题是您用于 32 位(4 字节)内存操作的地址必须与 4 字节边界对齐。这意味着地址必须是 4 的倍数,或者如果您愿意,地址的底部两位必须为零。

在这种情况下,最接近的 4 字节对齐地址将是 0x7F7F7F7C0x7F7F7F80 .

同样,LDRH/STRH需要 2 字节对齐,而 LDRB/STRB可以在任何地方操作(1 字节对齐 == 未对齐)。

一般来说,编译器/汇编器负责确保您的变量正确对齐它们的大小 - 如果您自己生成地址(根据问题),您应该只遇到这种情况。

关于assembly - 什么是非对齐访问? (ARM/凯尔),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926386/

相关文章:

assembly - 使用 JMP 代替 CALLS

assembly - ARM NEON : Store n-th position(s) of non-zero byte(s) in a 8-byte vector lane

gcc - 在 Thumb 代码中使用 BX 调用 Thumb 函数,或跳转到另一个函数中的 Thumb 指令

c - Visual Studio 相当于 Arm #pragma anon_unions

c++ - Visual C++ 内联汇编程序和定义字符串?

android - 仅支持 Android 4 及更高版本的 armeabi-v7a 是否安全?

c - 文件系统,磁盘输出上的意外写入/读取

debugging - 即使 (--cx != 0),LOOP 指令也无法循环

ubuntu - 汇编 x86 nasm 输出浮点值

C 编译器未生成有效的汇编输出