MIPS程序无法正确打印文件

时间:2017-09-27 07:19:27

标签: mips

我有一项任务要求我们在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:

老实说,我认为错误可能在循环函数中;我非常确定我的测试逻辑是否合理,但我可能很容易忽略一些东西。再一次,不要担心寄存器看起来没有正确恢复,这些都已经完成了。

0 个答案:

没有答案