assembly - ARM 汇编 - 转换字节顺序

标签 assembly arm endianness

这是目前我和我的队友被困在的家庭作业项目。我们还没有得到太多关于 Assembly 的介绍,这应该是我们的第一个家庭作业。任务是创建一个将 0xAABBCCDD 转换为 0xDDCCBBAA 的程序。

我不是在寻找答案,因为那会破坏目的,但我们对这个愚蠢的事情的难度感到非常沮丧。我们认为我们在创建可行的解决方案方面有了一个良好的开端,但我们就是无法提出该计划的其余部分。

首先,我们将每个元组 (aa)、(bb)、(cc)、(dd) 屏蔽到不同的寄存器中:

LDR R0, LittleEndian    // 0xAABBCCDD
AND R1, R0, #0xFF000000 // 0xAA
AND R2, R0, #0x00FF0000 // 0xBB
AND R3, R0, #0x0000FF00 // 0xCC
AND R4, R0, #0x000000FF // 0xDD

然后我们尝试将它们重新对齐到 R0 寄存器中,但如果我们能想出一个好的解决方案...

我们最大的努力来自:

ORR R0, R1, LSL #24 
ORR R0, R2, LSL #8
ORR R0, R3, LSR #8
ORR R0, R4, LSR #24

出于某种奇怪的原因产生了 0xBBBBCCDD;我们真的不知道。

如有任何提示,我们将不胜感激。同样,我们寻求帮助,而不是寻求解决方案。

干杯!

最佳答案

在 ARMv6 及更高版本上,您可以只使用 rev 指令,但我认为无论出于何种原因都不允许您这样做。

至于为什么你得到了你所做的结果,我已经检查了你的代码并评论了正在操作的寄存器的实际值:

LDR R0, LittleEndian    // r0 = 0xAABBCCDD
AND R1, R0, #0xFF000000 // r1 = 0xAA000000
AND R2, R0, #0x00FF0000 // r2 = 0x00BB0000
AND R3, R0, #0x0000FF00 // r3 = 0x0000CC00
AND R4, R0, #0x000000FF // r4 = 0x000000DD

ORR R0, R1, LSL #24     // r0 = 0xAABBCCDD | 0x00000000 = 0xAABBCCDD
ORR R0, R2, LSL #8      // r0 = 0xAABBCCDD | 0xBB000000 = 0xBBBBCCDD
ORR R0, R3, LSR #8      // r0 = 0xBBBBCCDD | 0x000000CC = 0xBBBBCCDD
ORR R0, R4, LSR #24     // r0 = 0xBBBBCCDD | 0x00000000 = 0xBBBBCCDD

这里发生的是你的移动方向向后;您不想将 0xAA000000 左移 24 位,而是想右移 24 位,得到 0x000000AA。此外,您永远不会将 r0 的内容置零,您也需要这样做才能使这种方法起作用。如果您解决了这些问题,您的代码将按预期工作(尽管有更紧凑的方法可以完成相同的任务)。

关于assembly - ARM 汇编 - 转换字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2755171/

相关文章:

c - 如何在实模式下使用 C 字符数组

c - 编译内联 MMX 汇编程序时出错 : Suffix or operands invalid

c - powerPC 中的 pclose 问题

c - 转换是否会在整个系统中保持低位字节一致?

c - uint32_t 的字节输出

assembly - MASM 中的@data 指令是什么意思?

c - (&) 的地址从符号表中获取值

使用指针将数据从一个地址复制到另一个地址

c - ARM cortex M4 组件闪烁 LED 延迟

转换指针地址偏移量不同