我想仅用移位和旋转指令替换以下指令集中(在汇编 MIPS 中)中的“AND”,显然对于任何单词都有相同的结果
.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 位。
关于assembly - 对于已知常量 AND 掩码,仅使用移位和旋转进行逻辑 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68121445/