gpt4 book ai didi

assembly - ARM 汇编中 32 位字内的高效按字节循环

转载 作者:行者123 更新时间:2023-12-03 06:33:40 25 4
gpt4 key购买 nike

假设我们有一个 32 位寄存器,由四个字节组成 R = b0|b1|b2|b3 .

我想做的是计算R'这样R' = (b0 <<< x) | (b1 <<< x) | (b2 <<< x) | (b3 <<< x)哪里x指的是任意值和 <<<指的是左字节旋转(即 10101110 <<< 2 = 10111010 )。

在 ARM 汇编中最有效的方法是什么?

最佳答案

我们可以通过移位的方式实现旋转并屏蔽掉我们不想要的位,从而得到想要的效果。这给了我们类似 C 中的代码:

/* byte-wise right rotate */
unsigned brrot(unsigned R, x)
{
unsigned mask;

mask = 0x01010100U - (0x01010101U << R);

return ((x & mask) >> R | (x & ~mask) << (8-R));
}

转换为 ARM 拇指组件,这应该给我们:

ldr r2, =0x01010101      @ load 0x01010101
sub r3, r2, #1 @ compute 0x01010100
sub r2, r2, r3, lsl r0 @ compute mask
and r3, r1, r2 @ compute x & mask
bic r2, r1, r2 @ compute x & ~mask
lsr r3, r3, r0 @ compute (x & mask) >> R
rsb r0, r0, #8 @ compute 8 - R
orr r0, r3, r2, lsl r0 @ compute (x & mask) >> R | (x & ~mask) << (8 - R)

如果已知进位标志在此序列之前已清除,则可以通过将两个减法替换为来节省一条指令

sbc r2, r2, r3, lsl r0   @ compute mask

关于assembly - ARM 汇编中 32 位字内的高效按字节循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com