Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 您有一个64位的数字0xCCCCAAAAAA。编写汇编程序实现64位逻辑右移。将此64位数字右移4_Assembly_Arm - Fatal编程技术网

Assembly 您有一个64位的数字0xCCCCAAAAAA。编写汇编程序实现64位逻辑右移。将此64位数字右移4

Assembly 您有一个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

问:您有一个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     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