在MIPS中编写迭代
我正在用MIPS编写这个程序,将2计算为我给定的幂,并将顺序幂相加为0。例如,如果我像下面的代码一样在$a0中放入4,我希望它计算(4^2)+(3^2)+(2^2)+(1^2),结果应该是15。它应该在达到零之前停止。这就是我到目前为止写的在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
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.
。等或<代码