Mips SLL 运算符

Mips SLL operator

我正在尝试实现 2^15 并使用 lls 减 1。我基本上是在尝试做 2^15、2^14 等。然后打印该值。但是,我遇到了麻烦,我不知道为什么。它在两次迭代后停止,因为它变为 0。输出是 (32768 16384 0 -16384 -32768 -49152 -65536 -81920 等) 有什么建议吗?谢谢

   addi $s1, $zero, 2

Loop2:
beqz $s1, end2 #if 15 reches 0 than end
sll $t1, $s1, 14
#decrement by 1
addi $s1,$s1,-1


#add 1 into $v0 print
addi $v0, $zero, 1

#move ($s0) into $a0
move $a0, $t1

syscall

sll $t1, $s1, 2 在这种情况下表示 $t1 = $s1 << 2,它只是将 $s1 乘以 4。要执行 ^15,您可能想要执行

addi $s1, $zero, 2
sll $t1, $s1, 14

对于已编辑的问题

这是我的解决方案:

addi $s1, $zero, 2  # base is 2
sll $t1, $s1, 14    # $t1 = 2 << 14

Loop2:
addi $v0, $zero, 1  # use print int service
move $a0, $t1       # load $t1 into argument
syscall

srl $t1, $t1, 1     # shift right, effectively decrement the exp by 1

bnez $t1, Loop2     # loop until $t1 is zero

以下是我更改的一些主要内容:

  • beqz $s1, end2 #if 15 reches 0 than end移动到循环的末尾并翻转了逻辑。
    • 你的想法是你想要返回,除非结果变为 0。不确定 end2 是另一个标签还是只是一个拼写错误,但你希望有一些分支回到开头循环。
  • addi $s1,$s1,-1 实际上是在改变基数,而不是指数。
    • 所以你得到的基本上是 2 << 14、1 << 14、0 << 14、-1 << 14,等等
    • 在这种情况下要减少指数,您所要做的就是将先前的结果取消移位(或右移)1。因此我的代码中的 srl $t1, $t1, 1

我认为您正在寻找可变数量的班次,因此请使用 sllv

试试这样的东西,它是 1 << n:

的汇编代码
li $t0, 1
sllv $t1, $t0, $s1

代替您的班次 (sll $t1, $s1, 2)。