我正在用MIPS编写这个程序来计算2给我的功率并将顺序功率减少到0.例如,如果我在$ a0中加4,就像在下面的代码中一样,我希望它计算(应该是15 ^ 2)+(3 ^ 2)+(2 ^ 2)+(1 ^ 2)它应该在它达到零之前停止。这是我到目前为止所写的内容
main:
addi $a0, $zero, 4 #put k in $a0 in this case
addi $a1, $zero, 0 #put 0 in current sum
addi $v1, $v1, 0 #tally the total in $v1
for:
lw $10, $a0 #load k into reg $10
lw $11, $a1 #load sum into $11
addi $10, $10, -1 #subtracts 1 from k
li $9, 0 #sets i in for loop ($9) to 0
完成:
li $v0, 10
syscall
我是MIPS的新手并且可以在完成此操作时使用很多帮助,我知道我想使用for循环,但是我不知道如何在从k中减去1并且还计算和。如何将2加到k的幂,因为我猜mips中没有电源操作。在课程的这一点上,我只能使用add,sub,和,或slt,addi,j,beq,lw,sw和sll。使用sub时可以不使用常量吗?感谢您的帮助
答案 0 :(得分:1)
幂是乘法,乘法是和。因此,您可以编写一个通过添加进行乘法运算的函数,以及通过乘法运算来执行幂运算的另一个函数。例如,乘法函数:
multiply: # $a0 first factor, $a1 second factor, $v0 result of multiplication
or $t0, $zr, $zr
or $t1, $a1, $a1
or $t3, $zr, $zr
loop:
beq $t1, $zr, end
add $t0, $t0, $a0
addi $t1, $t1, -1
j loop
nop
end:
or $v0, $t0, $0
jr $ra
nop
(请注意我没有对此进行测试,这不适用于负数)
作为旁注,你也有MUL指令,但我不知道你是否已经看过。
答案 1 :(得分:0)
我认为你的导师试图向你展示的概念是sll
实际上乘以2.你必须用二进制思考。例如,让我们从1开始:
0000 0000 0000 0000 0000 0000 0000 0001
对此有所了解,你最终得到了什么? 0010
= 2.再次sll,你得到0100
= 4.依此类推,直到你完全转移并0x80000000
。
所以问题的答案,“我如何将2带到k的力量?”,比你想象的更简单:你将1换成k 。
# $t0 contains 'k', the amount we want to shift by
addi $t1, $zero, 1
sllv $t3, $t1, $t0
注意:我必须仔细检查您是否可以按可变金额换班,但this link表示sllv
有效。但是,由于它不在您允许的函数列表中,因此您必须在循环中执行sll $t1, $t1, 1
。 (一定要在循环开始时检查,以防你要转移的金额为零!)
答案 2 :(得分:0)
快速提问:
您在做2^4+2^3.
吗?等等?或4^2+3^2
等?
简要说明一下:
2^4+2^3+2^2+2^1+2^0 = 15.
4^2+3^2+2^2+2^1 != 15.
(如果是第一个,您确实需要2 ^ 0,因为您需要考虑奇数2 ^ 0 =1。这就是我们以二进制形式获取奇数的方式。)
在这种情况下,有关左移(lls
)的答案是正确的。左移二进制数时,会将2的指数增加1。
如此:
0001 = 1
0010 = 2
0100 = 4
1000 = 8
这些加起来等于15。
因此您可以向左移动,并将每次移动的结果添加到寄存器中。