ARM程序集 - 转换字节序

IAE*_*IAE 2 assembly arm endianness

这是目前我和我的队友坚持的家庭作业项目.我们没有多少介绍大会,这应该是我们的第一个家庭作业.任务是创建一个将0xAABBCCDD转换为0xDDCCBBAA的程序.

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

首先,我们将每个tupel(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
Run Code Online (Sandbox Code Playgroud)

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

我们的最大努力来自:

ORR R0, R1, LSL #24 
ORR R0, R2, LSL #8
ORR R0, R3, LSR #8
ORR R0, R4, LSR #24
Run Code Online (Sandbox Code Playgroud)

因某些奇怪的原因产生0xBBBBCCDD; 我们真的不知道.

任何提示将不胜感激.我们再次寻求帮助,但不是寻求解决方案.

干杯!

Ste*_*non 5

在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
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是你向后移动方向; 而不是左移0xAA00000024,你想要将它右移 24,给予0x000000AA.此外,您从未r0将用于此方法工作的内容清零.如果您解决了这些问题,您的代码将按预期工作(尽管有更紧凑的方法来完成相同的任务).