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
)。
我正在尝试实现 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
是另一个标签还是只是一个拼写错误,但你希望有一些分支回到开头循环。
- 你的想法是你想要返回,除非结果变为 0。不确定
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
)。