装配Mips取代"和"使用旋转和移位命令

时间:2015-07-07 09:18:16

标签: assembly mips

有没有办法交换"和"在以下代码行中只有旋转和移位命令的命令?我喜欢它可以处理任何输入,而不仅仅是这个输入。任何帮助表示赞赏。

        .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

2 个答案:

答案 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
  1. 旋转 X 返回
  2. 我们将 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++;
    }
}