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; 我们真的不知道.
任何提示将不胜感激.我们再次寻求帮助,但不是寻求解决方案.
干杯!
在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将用于此方法工作的内容清零.如果您解决了这些问题,您的代码将按预期工作(尽管有更紧凑的方法来完成相同的任务).
| 归档时间: |
|
| 查看次数: |
1708 次 |
| 最近记录: |