0

我正在用 MIPS 编写这个程序来计算 2 到我给定的幂,并将顺序幂求和到 0。例如,如果我像下面的代码一样将 4 放入 $a0 中,我希望它计算 (4^2 )+(3^2)+(2^2)+(1^2) 应该是 15。它应该在达到零之前停止。这是我到目前为止所写的

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、and、or、slt、addi、j、beq、lw、sw 和 sll。使用 sub 时不能使用常量吗?感谢您的任何帮助

4

3 回答 3

2

幂是乘法,乘法是和。因此,您可以编写一个通过加法进行乘法运算的函数,以及另一个通过乘法运算进行幂运算的函数。例如乘法函数:

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 指令,但我不知道你是否已经看到了。

于 2013-11-04T21:08:06.037 回答
1

我认为您的讲师试图向您展示的概念sll实际上是乘以 2。您必须以二进制方式思考。例如,让我们从 1 开始:

0000 0000 0000 0000 0000 0000 0000 0001

对此做一个'sll',你最终会得到什么?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

注意:我必须仔细检查您是否可以按可变数量移动,但这个链接sllv是有效的。但是,由于它不在您的允许功能列表中,因此您必须sll $t1, $t1, 1循环执行。(一定要在循环开始时打勾,以防你想要移动的数量为零!)

于 2013-11-04T22:07:28.383 回答
0

快速提问:

你在做什么2^4+2^3.。ETC?还是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。

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

于 2019-11-16T23:01:48.480 回答