assembly - 对于已知常量 AND 掩码,仅使用移位和旋转进行逻辑 AND

标签 assembly bit-manipulation mips bit-shift

我想仅用移位和旋转指令替换以下指令集中(在汇编 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/

相关文章:

windows-7 - 在 Windows 7 64 位上运行时出现 Tiny Pe 文件格式程序错误

c++ - pcmpestri指令写出类似strpos的函数?

C 到 MIPS 转换 : decoder

java - 如何检测 32 位 int 上的整数溢出?

c++ - 如何翻转内存块中的任何位?

assembly - 正确使用CPU寄存器——调度概念

gcc - 使用现有的交叉编译器构建 newlib

assembly - 为什么即使启用了 intel_syntax,十六进制 'h' 后缀在 GNU 汇编器中也不起作用?

gcc - 没有这样的指令: dd 0

PHP 等效的 javascript >>> 使用零填充按位运算符右移?