ARM ASM 中的 LDRB - 一般问题

J.S*_*sey 2 assembly load arm

我使用的是 ARM 架构,我对 LDRB 的概念有点不清楚。LDRB 是带有可选 B 命令的 LDR,用于加载 32 位字的最低有效字节。三个问题。

  1. 我真正想要的是前 8 位,而不是后 8 位(我正在遍历一个数组)。有没有一种优雅的方法来做到这一点?我找不到它的命令。
  2. 我现在正在做的是 SUB r4, r4, #3 将 r4(我要加载的指针)移回三个字节,以便最低有效字节现在是 32 位字前面的一个。如果我所做的只是向前迭代,这是否容易导致内存问题?
  3. 我正在使用 LDRB r7、r4;这应该将最低有效字节从 r4 加载到 r7。零扩展,这意味着会出现类似 00...00010101 或 10101000...00 的内容?

Not*_*hat 5

如果您想要 32 位字的 MSB,则获取 32 位字的 MSB:

LDR R0, [R1]
LSR R0, #24
Run Code Online (Sandbox Code Playgroud)

其他任何东西都是令人困惑的,并且在不同字节序的系统之间完全不可移植 - 试图在 BE 系统上假设 LE 中断的情况下对字进行字节寻址。如果 BE-8 发现自己位于古老的 BE-32 系统上,那么它就会失效。

事实上,如果从加载字节[word ptr - #3]真的给你的最高位,而不是前一个单词的第二至少显著字节的话,我觉得你一个BE-32系统*上-因此这不会对任何现代的正常工作。

* 或者可能是 BE-8 - 内存字节序与总线字节序以及字与字节寻址的诡计非常令人困惑,我不声称已经完全掌握了它。