Assembly 您有一个64位的数字0xCCCCAAAAAA。编写汇编程序实现64位逻辑右移。将此64位数字右移4
问:您有一个64位的数字0xCCCCAAAAAA。编写汇编程序实现64位逻辑右移。将此64位数字右移4Assembly 您有一个64位的数字0xCCCCAAAAAA。编写汇编程序实现64位逻辑右移。将此64位数字右移4,assembly,arm,Assembly,Arm,问:您有一个64位的数字0xCCCCAAAAAA。编写汇编程序实现64位逻辑右移。将此64位数字右移4 LDR R0, =0xCCCCCCCC LDR R1, =0xAAAAAAAA LSR R2, R0, #2 LSR R3, R1, #2 将每个32位段移位2是否等于将64位数字移位4 movw r0, #0xaaaa movw r1, #0xcccc movt r0, #0xaaaa movt r1, #0xcccc lsr r2, r0, #4 lsr
LDR R0, =0xCCCCCCCC
LDR R1, =0xAAAAAAAA
LSR R2, R0, #2
LSR R3, R1, #2
将每个32位段移位2是否等于将64位数字移位4
movw r0, #0xaaaa
movw r1, #0xcccc
movt r0, #0xaaaa
movt r1, #0xcccc
lsr r2, r0, #4
lsr r3, r1, #4
bfi r2, r1, #28, #4
这是最明显的一个,如果在C中使用它,您将使用它
00000000 <fun>:
0: e1a00220 lsr r0, r0, #4
4: e1800e01 orr r0, r0, r1, lsl #28
8: e1a01221 lsr r1, r1, #4
c: e12fff1e bx lr
00000000:
0:e1a00220 lsr r0,r0,#4
4:e1800e01或r0、r0、r1、lsl#28
8:e1a01221 lsr r1,r1,#4
c:E12FF1E bx lr
但也有这些,都是手臂
00000000 <fun>:
0: 070b lsls r3, r1, #28
2: 0900 lsrs r0, r0, #4
4: 4318 orrs r0, r3
6: 0909 lsrs r1, r1, #4
8: 4770 bx lr
00000000 <fun>:
0: 0900 lsrs r0, r0, #4
2: ea40 7001 orr.w r0, r0, r1, lsl #28
6: 0909 lsrs r1, r1, #4
8: 4770 bx lr
0000000000000000 <fun>:
0: d344fc00 lsr x0, x0, #4
4: d65f03c0 ret
00000000:
0:070b lsls r3,r1,#28
2:0900 LSR0,r0,#4
4:4318奥尔斯r0,r3
6:0909 lsrs r1,r1,#4
8:4770 bx lr
00000000 :
0:0900 LSR0,r0,#4
2:ea40 7001或w r0、r0、r1、lsl#28
6:0909 lsrs r1,r1,#4
8:4770 bx lr
0000000000000000 :
0:d344fc00 lsr x0,x0,#4
4:d65f03c0 ret
当然,你要填写常量。不,这不是一回事。C编译器可以告诉你如何做,因为
返回x>>4代码>在uint64\U t x上@SamiKuhmonen你好Sami!您能解释一下我如何更正代码吗?我现在对此非常困惑。使用计算器来计算答案,并确保您的代码序列得到正确的答案。仅供参考,64位的答案是0x0CCCCAAAAA,因此在2个32位的一半中:0x0CCCCC,0xCAAAAAA。必须移位4,才能将这两部分结合起来:从高阶的4个低位移到低阶的高位。您将移动2,而不是将一个0xC移动到另一个。正如彼得所说,使用godbolt,arch=arm7-a(铿锵)和option-O3将向您展示编译器的功能。请不要通过破坏您的帖子为其他人做更多的工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下不可撤销的权利,以分发该内容(即,无论您未来的选择如何)。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果您想了解有关删除帖子的更多信息,请参阅:这比使用查找表更简单…请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引更高的票数。@Markrottveel这取决于OP的级别。这一个不需要解释,而是一个包含多个章节的完整教程:Ch1。二者互补;亚甲基ARM指令编码;甲基桶形移位器;甲烷。32位系统上的64位整数;Ch5。管道;Ch6。依赖性;Ch7。ARM指令周期定时;我不会这么做——至少不是免费的。
00000000 <fun>:
0: 070b lsls r3, r1, #28
2: 0900 lsrs r0, r0, #4
4: 4318 orrs r0, r3
6: 0909 lsrs r1, r1, #4
8: 4770 bx lr
00000000 <fun>:
0: 0900 lsrs r0, r0, #4
2: ea40 7001 orr.w r0, r0, r1, lsl #28
6: 0909 lsrs r1, r1, #4
8: 4770 bx lr
0000000000000000 <fun>:
0: d344fc00 lsr x0, x0, #4
4: d65f03c0 ret