首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ARM7汇编程序中正确旋转64位值?

如何在ARM7汇编程序中正确旋转64位值?
EN

Stack Overflow用户
提问于 2011-03-21 14:40:31
回答 1查看 2.9K关注 0票数 3

ARM7 7命令集提供了在汇编程序中以任意数量正确旋转32位值的有效方法。对于一个操作的第二个操作数,通过将ror #n指定为移位操作数,它是偶数"for free“,但是对于64位整数,指令集不提供直接支持。除了1,31,33或63位位置旋转的特殊情况(更不用说0或32位了),我只知道如何使用四条指令旋转64位值(这很容易,所以我在这里不写)。在这四种特殊情况下,我可以将其简化为三条指令,但我不知道一般情况下该如何做。所以我的问题是:

给定两个寄存器中的64位值,例如R0和R1,是否可以用3 ARM7指令将这个值右旋转n个位置(对于任意的n)?

EN

回答 1

Stack Overflow用户

发布于 2011-03-25 15:48:39

如果有解决办法的话,gcc也不承认:

代码语言:javascript
复制
unsigned long long int reg64 = random_value;
unsigned int n = shift_value;
reg64 = (reg64 >> (n%64)) | (reg64 << ((64-n)%64));

结果如下:

n=1:

代码语言:javascript
复制
MOVS R2, R0, LSR #1
MOV R3, R1, RRX
ORR R2, R2, R1, ASL #31

n=2-31:

代码语言:javascript
复制
MOV R2, R0, LSR #n
ORR R2, R2, R1, ASL #32-n
MOV R3, R0, ASL #32-n
ORR R3, R3, R1, LSR #n

n=33-62:

代码语言:javascript
复制
MOV R3, R0, ASL #64-n
ORR R3, R3, R1, LSR #n-32
MOV R2, R0, LSR, #n-32
ORR R2, R2, R1, ASL #64-n

n=63:

代码语言:javascript
复制
ADDS R2, R0, R0
ADC R3, R1, R1
ORR R2, R2, R1, LSR #31
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5379218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档