在MIPS中编写迭代

时间:2013-11-04 20:58:49

标签: mips

我正在用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时可以不使用常量吗?感谢您的帮助

3 个答案:

答案 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。

因此您可以向左移动,并将每次移动的结果添加到寄存器中。