仅使用移位和旋转的逻辑AND,用于已知的常量AND掩码



我想替换;"与";在下面的一组指令中(在汇编MIPS中(,只有移位和旋转指令,显然对任何单词都有相同的结果

.text
main:
la $a0,input            
lw $t1,0($a0)           
li $t0,0xFFF00FFF   #mask
and $t2,$t1,$t0     
li $v0,10
syscall
.data
input:  .word 0x12345678

我知道对于这个特殊的面具,答案如下:

ror $t2, $t1, 9
srl $t2, $t2, 17
ror $t2, $t2, 6

我想知道上面的移位/旋转是如何计算的。

二进制输出为:

input : 00010010001101000101011001111000 ($t1)
mask  : 11111100000000000000000111111111 ($t0)
output: 00010000000000000000000001111000 ($t2)

您正在利用这样一个事实,即移位(逻辑(将移入0位并丢弃移出的位,而旋转将保留所有将移出的位带回另一端的位。因此,常数AND掩码将变为掩码中每个0范围的移位和每个1范围的旋转,总移位/旋转计数为32。

要计算偏移/旋转,只需找到遮罩中0或1的所有范围,然后偏移或旋转该量。您可以从掩码的底部(使用ror/srl(或从掩码的顶部(使用rol/sll(开始

因此,对于掩码0xfff00fff,从底部开始,你有12个1,然后是8个0,然后是12个1

ror $t2, $t1, 12
srl $t2, $t2, 8
ror $t2, $t2, 12

对于具有交替位(如0x55555555(的掩码的最坏情况,您最终总共有32个(交替(移位和旋转,每个移位和旋转1位。

最新更新