我有一项任务要求我们在MIPS中编写两个函数:一个确定数字是否为素数,另一个查找3到102之间的所有素数并将其打印出来。显然,第二个使用第一个;这是一个跳跃和分支练习。我们给出的源代码已经为我们清理了堆栈和寄存器等,并提供了一个函数来打印$ a0中的数字,所以我们需要做的就是前面提到的函数。无论我做什么,我的程序总是只打印" 1"并退出,即使它应该循环多个数字。我觉得我所犯的错误很简单,就像不将任何内容加载到需要它的寄存器中或忽略类似简单的东西,但我仍然是MIPS的新手并且调试汇编代码实际上是一场噩梦。以下是我写的两个函数:
这是用于检查数字是否为素数的那个:
ori $s0,$a0,0 #make a copy of the argument
ori $t0,$s0,0 #using temp registers is good
ori $s1,$s0,0 #make another copy to use as the loop-end check
li $t2,2 #use 2 as the divisor, makes it easier to check
li $v0,0 #using "not prime" as the base case
prime_test:
slt $t1,$t2,$s1 #check if we're above the ceiling
beq $t1,$zero,found_prime
div $t0,$t2 #check if number is divisible by 2
mfhi $t3 #get remainder from hi
beq $t3,$zero,not_prime #if hi=0, it's not a prime
addi $t2,$t2,1
j prime_test
not_prime:
add $v0,$zero,$zero #return false (0) if not prime
found_prime:
jal print_number #if it's prime, print it
这是用于循环和检查3到102的那个:
li $t0,102 #upper boundary
li $a0,3 #lower boundary
prime_loop:
slt $t5,$a0,$t0
beq $t5,$zero,found_all_primes
jal is_prime
slt $t2,$zero,$a0
bne $t2,$zero,prime_detected
prime_detected:
addi $a0,$a0,1 #increment the counter
j prime_loop
found_all_primes:
老实说,我认为错误可能在循环函数中;我非常确定我的测试逻辑是否合理,但我可能很容易忽略一些东西。再一次,不要担心寄存器看起来没有正确恢复,这些都已经完成了。