有没有办法交换"和"在以下代码行中只有旋转和移位命令的命令?我喜欢它可以处理任何输入,而不仅仅是这个输入。任何帮助表示赞赏。
.text
.globl __start
__start:
la $a0,Input
lw $t1,0($a0)
li $t0, 0x001FF800
and $t2, $t1, $t0
li $v0,10
syscall
.data
input: .word 0x12345678
答案 0 :(得分:1)
如果你想 X和Y ,根据Y的相应位,技巧选择性地清除 X的任何给定位。
假设 X 和 Y 是4位数字,每个位用一个字母命名
X = aBcd
Y = dEfg
我们分别在第3位 B 和 E 之间计算 AND 。
NOTA BENE 在我的记谱中,lsb是第一位。
让我们调用 i 位索引(从0开始),在本例中为i = 2
和 n 位数,在此案例n = 4
。
AND 可分四步执行。
<强> 1。将 B 位置于&#34;前面&#34;,即作为 X 的lsb
我们通过右侧的轮换来执行此操作。
X = ROR(X, i)
X = cdaB
注意 MIPS不支持轮换,但您可以轻松模拟它们。
<强> 2。隔离 E 位并将其带到&#34;前面&#34;
为了在没有任何 AND 的情况下执行此操作,我们首先将(副本)Y向右移动,然后向左移动
Y' = SHL(Y, n-1-i)
Y' = Efg0
Y' = SHR(Y', n-1-i)
Y' = 0Efg
Y' = SHR(Y', i)
Y' = 000E
第3。如果Y&#39;将 B 位归零。为零
现在如果Y&#39;如果为零,则必须清除 B 位,即X的lsb。为此,在没有 AND 的情况下,我们可以将 X 向右移动1,然后将其向左移动。
If Y' == 0 Then
X = SHR(X, 1)
X = 0cda
X = SHL(X, 1)
X = cda0
End If
如果 Y&#39; 不为0,则 X 保持不变。
我们注意到现在 X 的lsb是 B 和 E 之间的 AND ,我们可以调用此值< em> Z 并写下 X 如下:
X = cdaZ
我们将 X 转回
X = ROL(X, i)
X = aZcd
如果我们为每个i = 0..n-1计算这四个步骤,我们会在 X 和 Y AND > 强>
这里用MARS测试的相对MIPS代码
#$a0 = op1 $a1 = op2
add $v0, $0, $a0
ori $t0, $0, 31
ori $t1, $0, 1
add $t5, $0, $0
#$t0 = Counter
#$t1 = 32-Counter
PerformAnd:
#$t4 = ror $t4, $a0, $t1
add $t3, $0, $v0
srlv $t3, $t3, $t0
add $t4, $0, $v0
sllv $t4, $t4, $t1
or $t4, $t4, $t3
#$t3 = isolate bit $t0 of $a1
add $t3, $0, $a1
sllv $t3, $t3, $t5
srlv $t3, $t3, $t5
srlv $t3, $t3, $t0
bnez $t3, InverseROL
srl $t4, $t4, 1
sll $t4, $t4, 1 #Clear lsb of $t4
InverseROL:
add $t3, $0, $t4
sllv $t3, $t3, $t0
srlv $t4, $t4, $t1
or $v0, $t4, $t3
addi $t1, $t1, 1
addi $t5, $t5, 1
subi $t0, $t0, 1
bgez $t0, PerformAnd
答案 1 :(得分:0)
MIPS指令集 中没有任何旋转指令(ok,apparently there is在某些实现上) 。假设您有一些旋转寄存器的方法,下面的代码执行AND
- 更少AND
操作,该操作适用于任何32位输入。我将留给你在MIPS汇编中实现算法。
unsigned u = 0x12345678;
unsigned mask = 0x001FF800;
unsigned mask_count = 0;
while (mask_count < 32) {
// Keep bits in u where the corresponding bit in the mask is a 1
// The shifts in the while-expression are used to avoid an AND for checking the lsb
while ((((mask >> 1) << 1) != mask) && mask_count < 32) {
mask >>= 1;
u = ror(u, 1);
mask_count++;
}
// Clear bits in u where the corresponding bit in the mask is a 0
while ((((mask >> 1) << 1) == mask) && mask_count < 32) {
mask >>= 1;
u >>= 1;
mask_count++;
}
}