这让我大脑沸腾,我刚刚开始学习MIPS。赋值要求我们使用循环甚至堆栈来通过平方三位数来进行简单的乘法运算。为了使分配正确,程序需要运行至少30秒才能反复进行相同的计算。
显然我并没有要求你完成我的任务(我想学习),但是我很难理解如何在MIPS中实现嵌套循环,在网上没有多少。我在Stack Overflow上发现了一些东西并尝试实现相同的样式,但它不起作用。一个循环工作正常,它只运行一秒钟,所以它远不够近。我的问题是如何真正输入第二个循环。 这是我的代码:
.data
enterNumber: .asciiz "Enter three digit number \n"
.text
main:
addi $t3, $zero, 0
addi $t1, $zero, 0 #counter for second for loop
#asks for number
li $v0, 4
la $a0, enterNumber
syscall
#receives number
li $v0, 5
syscall
move $t0, $v0 #move number to t0
For1:
beq, $t3, $t0, exit #if counter= t0 then loop ends
For2:
beq, $t1, $t0, For1 #if counter= t0 then loop ends
addi $t2, $zero, 0 #resets t2 to 0
mul $t2, $t0, $t0 #multiply number multiplied by number
addi $t1, $t1, 1 #add 1 to counter
j For2 #jump back to the top
addi $t2, $zero, 0 #resets t2 to 0
mul $t2, $t0, $t0 #multiply number multiplied by number
addi $t3, $t3, 1 #add 1 to counter
j For1 #jump back to for loop
exit:
li $v0, 1
move $a0, $t2 #print out multiplication
syscall
#tell system to stop
li $v0, 10
syscall
程序在内循环(For2)中运行正常,但它根本不会增加外循环。提前致谢
答案 0 :(得分:0)
您的代码的唯一问题是您在外循环(For1)中编写的所有内容在内循环(For2)之后将永远不会执行,因为您在 For2 中编写条件的方式。你只需要对你的循环代码做一个小改动:让 For2 跳转到 For1 循环的最后一部分,以防 counter = t0 而不是让它跳转到 For1。
For1:
beq, $t3, $t0, exit #if counter= t0 then loop ends
For2:
beq, $t1, $t0, exit2 #if counter= t0 then loop ends
addi $t2, $zero, 0 #resets t2 to 0
mul $t2, $t0, $t0 #multiply number multiplied by number
addi $t1, $t1, 1 #add 1 to counter
j For2 #jump back to the top
exit2:
addi $t2, $zero, 0 #resets t2 to 0
mul $t2, $t0, $t0 #multiply number multiplied by number
addi $t3, $t3, 1 #add 1 to counter
j For1 #jump back to for loop
答案 1 :(得分:0)
您需要对循环代码进行一些小的更改。 在 counter = t0 的情况下,让 For2 跳转到 For1 循环的最后一部分,而不是让它跳转到 For1。 在 For1 循环下写下面的代码。
q = session.query(Question, Question.answers_yes_percentage)
for question, percentage in q:
print(question, percentage)
并在 for2 中进行更改。让它跳转到 For2exit 而不是 For1。