【问题标题】:How to rotate and shift a 64-bit integer on ARM Cortex-M3?如何在 ARM Cortex-M3 上旋转和移位 64 位整数?
【发布时间】:2021-01-17 18:35:22
【问题描述】:

我有一个 64 位数量,其中最高有效 32 位在 R2 中,最低有效 32 位在 R3 中。

如何将 64 位逻辑和算术右移 4 位?
另外,我怎样才能 64 位将这些右旋转 2 位。

如何在 32 位 ARM 上以最少的指令数做到这一点?

【问题讨论】:

  • 最好先将这两个部分合并到一个寄存器中。
  • 但是寄存器是 32 位的
  • 对不起,我很抱歉。由于某种原因,您正在为 ARM64 编程。无论如何,弄清楚这些事情的一个好主意是让 C 编译器为你做这件事,然后复制它所做的事情。例如。请参阅 here 了解 clang 会做什么。
  • 谢谢!如果有更好的答案,我会查看并搜索更多内容
  • 没有更好的答案,寄存器是 32 位,您必须使用多条指令来执行分段移位。不管这是 arm 或 mips 还是 C 或 java,它都是相同的进程(具有固定大小的变量/寄存器)。某些语言可能具有更多功能,可以缩短流程,但最终没有更好的答案。

标签: assembly arm 64-bit bit-shift shift


【解决方案1】:
unsigned long long fun ( unsigned long long x, unsigned int y)
{
    return(x<<y);
}
Disassembly of section .text:

00000000 <fun>:
   0:   f1a2 0c20   sub.w   r12, r2, #32
   4:   fa00 fc0c   lsl.w   r12, r0, r12
   8:   f1c2 0320   rsb r3, r2, #32
   c:   4091        lsls    r1, r2
   e:   fa20 f303   lsr.w   r3, r0, r3
  12:   ea41 010c   orr.w   r1, r1, r12
  16:   4090        lsls    r0, r2
  18:   4319        orrs    r1, r3
  1a:   4770        bx  lr

如果我有两个持有 8 位值 abcd efgh 的 4 位寄存器,并且我想将其左移 3 位,那么这两个部分都需要左移 3 位

abcd -> d000
efgh -> h000
But also the lower has to shift right one bit (4-3 = 1)
efgh -> 0efg
Then add/or d000 and 0efg giving the result
defg h000

指令集或编程语言在这里通常无关紧要,您可以使用多种语言和指令集进行上述操作。

一些指令集只有一个位移位,但也有许多指令集通过进位循环移动一个位移位,所以一个位移可以用

clear carry
rotate lower through carry one bit
rotate upper through carry one bit

然后你在一个循环中重复或展开尽可能多的位。

当然,您可以移动的位数不受限制,使用 32 位寄存器和足够的内存,您可以将 123456 字节数移动 n 位。

右移、左移、旋转都是同一个概念,实现就好了。

另一个例子。

unsigned long long fun ( unsigned long long x)
{
    return(x<<3);
}

   0:   4603        mov r3, r0
   2:   00c9        lsls    r1, r1, #3
   4:   00c0        lsls    r0, r0, #3
   6:   ea41 7153   orr.w   r1, r1, r3, lsr #29
   a:   4770        bx  lr

32 - 3 = 29。

【讨论】:

  • 总是提供丰富的信息并具有良好的旧实用性......
猜你喜欢
  • 2014-05-10
  • 2017-07-27
  • 2011-10-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2014-06-08
相关资源
最近更新 更多