在MIPS中编写迭代

在MIPS中编写迭代,mips,Mips,我正在用MIPS编写这个程序,将2计算为我给定的幂,并将顺序幂相加为0。例如,如果我像下面的代码一样在$a0中放入4,我希望它计算(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

我正在用MIPS编写这个程序,将2计算为我给定的幂,并将顺序幂相加为0。例如,如果我像下面的代码一样在$a0中放入4,我希望它计算(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和or、slt、addi、j、beq、lw、sw和sll。使用sub时不能使用常量吗?谢谢你的帮助

幂就是乘法,乘法就是和。所以你可以写一个通过加法进行乘法运算的函数,和另一个通过乘法进行幂运算的函数。例如,乘法函数:

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指令,但我不知道你是否已经看到了。幂是乘法,乘法是和。所以你可以写一个通过加法进行乘法运算的函数,和另一个通过乘法进行幂运算的函数。例如,乘法函数:

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指令,但我不知道你是否已经看到了。幂是乘法,乘法是和。所以你可以写一个通过加法进行乘法运算的函数,和另一个通过乘法进行幂运算的函数。例如,乘法函数:

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指令,但我不知道你是否已经看到了。幂是乘法,乘法是和。所以你可以写一个通过加法进行乘法运算的函数,和另一个通过乘法进行幂运算的函数。例如,乘法函数:

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

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

0000 0000 0000 0000 0000 0000 0000 0001
在那上面做个“sll”,你会得到什么<代码>0010=2。再次sll,您得到
0100
=4。依此类推,直到您一直移动并获得
0x8000000

所以这个问题的答案,“我怎样才能把2变成k的幂?”比你想象的要简单:你用k移动1


注意:我必须再次检查您是否可以按可变量进行移位,但表示
sllv
有效。但是,由于它不在允许的函数列表中,因此必须在循环中执行
sll$t1,$t1,1
。(一定要把支票放在循环的开始处,以防你想移位的量为零!)

我想你的指导老师想告诉你的概念是,sll实际上是乘以2。你必须用二进制来思考。例如,让我们从1开始:

0000 0000 0000 0000 0000 0000 0000 0001
在那上面做个“sll”,你会得到什么<代码>0010=2。再次sll,您得到
0100
=4。依此类推,直到您一直移动并获得
0x8000000

所以这个问题的答案,“我怎样才能把2变成k的幂?”比你想象的要简单:你用k移动1


注意:我必须再次检查您是否可以按可变量进行移位,但表示
sllv
有效。但是,由于它不在允许的函数列表中,因此必须在循环中执行
sll$t1,$t1,1
。(一定要把支票放在循环的开始处,以防你想移位的量为零!)

我想你的指导老师想告诉你的概念是,sll实际上是乘以2。你必须用二进制来思考。例如,让我们从1开始:

0000 0000 0000 0000 0000 0000 0000 0001
在那上面做个“sll”,你会得到什么<代码>0010=2。再次sll,您得到
0100
=4。依此类推,直到您一直移动并获得
0x8000000

所以这个问题的答案,“我怎样才能把2变成k的幂?”比你想象的要简单:你用k移动1


注意:我必须再次检查您是否可以按可变量进行移位,但表示
sllv
有效。但是,由于它不在允许的函数列表中,因此必须在循环中执行
sll$t1,$t1,1
。(一定要把支票放在循环的开始处,以防你想移位的量为零!)

我想你的指导老师想告诉你的概念是,sll实际上是乘以2。你必须用二进制来思考。例如,让我们从1开始:

0000 0000 0000 0000 0000 0000 0000 0001
在那上面做个“sll”,你会得到什么<代码>0010=2。再次sll,您得到
0100
=4。依此类推,直到您一直移动并获得
0x8000000

所以这个问题的答案,“我怎样才能把2变成k的幂?”比你想象的要简单:你用k移动1


注意:我必须再次检查您是否可以按可变量进行移位,但表示
sllv
有效。但是,由于它不在允许的函数列表中,因此必须在循环中执行
sll$t1,$t1,1
。(确保将支票放在循环的开始处,以防您要移动的金额为零!)

快速问题:

您正在执行
2^4+2^3.
。等或<代码