MIPS中的sll指令是如何工作的?

MIPS中的sll指令是如何工作的?,mips,bit-shift,Mips,Bit Shift,以下汇编代码在我的教科书中给出 Loop: sll $t1, $t0, 2 add $t2, $a0, $t1 sw $zero, 0($t2) addi $t0, $t0, 1 slt $t3, $t0, $a1 bne $t3, $zero, Loop # return where we were jr $ra 根据这段代码,我有两个问题要问 第一个问题是关于顶部的第二行。我得到指令sll是左移位逻辑,它将位向左移位。由于移位量为2,它将使十进制的0000->0100=4。但我在第一

以下汇编代码在我的教科书中给出

Loop:
sll $t1, $t0, 2 
add $t2, $a0, $t1
sw $zero, 0($t2)

addi $t0, $t0, 1
slt $t3, $t0, $a1
bne $t3, $zero, Loop

# return where we were
jr $ra
根据这段代码,我有两个问题要问

第一个问题是关于顶部的第二行。我得到指令
sll
是左移位逻辑,它将位向左移位。由于移位量为2,它将使十进制的0000->0100=4。但我在第一圈后就不明白了。如果我们把这个移到左边2,不是乘以4吗

第二个问题是,是否有可能优化此代码??在我看来,我可以修改
sll
并在代码中添加部分,但我不确定。
任何向左移动的注释都将插入0,而不是1。所以0000仍然是0000,0001将在换班后变成0100

[是否]可以优化此代码

做同样事情的更简洁的方法是:

sll $a1, $a1, 2
addu $a1, $a1, $a0   # $a1 = $a1 * 4 + $a0
Loop:
sw $zero, ($a0)
addiu $a0, $a0, 4
bne $a0, $a1, Loop
我做出以下假设:

  • 循环结束后,不再需要
    $a0
    $a1
    的原始值。如果需要,请在进入循环之前将原始值保存在某个位置(在其他寄存器或堆栈上),然后恢复
  • $t0
    从零开始。如果没有,则必须在循环之前将
    $t0*4
    添加到
    $a0
    。我还假设退出循环后,
    $t0
    的值是无关的

    • 考虑以下二进制文件:

      0000 0001
      
      如果将位左移1位,则得到:

      0000 0010
      
      如果再次向左移动1位数:

      0000 0100
      
      再说一遍:

      0000 1000
      
      上述二进制值等于1;1x2=2;2x2=4;4x2=8。 如果N是要移位的位数,则向左移位位等于将该值乘以2^N

      另一个换档示例:

      Assume $t1 contains 0000 1111
      
      sll $t0, $t1, 3    # $t0 = $t1 * 2^3
      
      Now $t0 contains 0111 1000
      
      您可以通过执行十进制乘法来验证这一点。15*8=120