我想替换;"与";在下面的一组指令中(在汇编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位。