这是目前我和我的队友被困在的家庭作业项目。我们还没有得到太多关于 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/