2013-03-25 39 views
0

我正在尝试排查/理解MIPS汇编程序设计中可能出现的问题。这是相当基本的,我们必须实现一个递归调用来更新“计数器”并在计数器达到0时退出循环。根据PCSpim的说法,我的错误显示计数器值为NULL。用MIPS汇编语言中的“counter”递归调用

.data 
string: .asciiz "Recursive call counter " 

.text 
.globl main 


main:  
    subu $sp, $sp, 32  # create stack frame 

    sw $ra, 28($sp)  # save ($fp, $ra) registers 
    sw $fp, 24($sp) 

    addu $fp, $sp, 28  # set up the new frame pointer 

    sw $s0, 20($sp)  # save other GPR’s 

    li $s1, 10   # load counter to $s1 

    li $v0, 4   # print counter message and counter 
    la $a0, string 
    syscall 
    li $v0, 4 
    la $a0, ($s1) 
    syscall 

    jal recursive_call  # jump to recursive call 



    lw $s0, 20($sp)  # restore registers 

    lw $fp, 24($sp)  # restore SP, FP, $ra for the caller 
    lw $ra, 28($sp)   


    addu $sp, $sp, 32  # restore the caller's stack pointer 

    jr $31    #end program 




recursive_call: 
    subu $sp, $sp, 32  # create stack frame 

    sw $ra, 28($sp)  # save ($fp, $ra) registers 
    sw $fp, 24($sp) 

    addu $fp, $sp, 28  # set up the new frame pointer 

    sw $s0, 20($sp)  # save other GPR’s 

    sub  $s1, $s1, 1  # subtract one from counter 


    li $v0, 4   #print counter number 
    la $a0, ($s1) 
    syscall 

    beq  $s0, $zero, SKIP # if counter = 0, go to skip 

    jal  recursive_call  # jump to recursive call 


SKIP: 
    lw $s0, 20($sp)  # restore registers 

    lw $fp, 24($sp)  # restore SP, FP, $ra for the caller 
    lw $ra, 28($sp)   


    addu $sp, $sp, 32  # restore the caller's stack pointer 

    jr $ra 

任何帮助将不胜感激。我将继续排查问题,看看我能否提出任何问题。

回答

1

我不知道这是什么应该是:

li $v0, 4 
la $a0, ($s1) 
syscall 

你可能想:

li $v0,1 # print_int 
mov $a0,$s1 
syscall 

然后还有这个:

beq  $s0, $zero, SKIP # if counter = 0, go to skip 

你的计数器是$s1,但你比较$s0

+0

您提出的建议解决了问题。非常感谢您的帮助! – user2109706 2013-03-25 16:40:01