由于$ ra的地址不正确,我的MIPS asm代码中的无限循环

时间:2015-11-28 20:05:35

标签: assembly mips

我有两个方法,print_board和print_line。

print_board多次调用print_line来打印我们游戏板的每一行,向它发送我们想要以$ a1开始打印的位置的索引,当我们打印所有行时,print_board将通过打印底部边框完成我们的董事会。

出于某种原因,当我们完成所有行的打印时,它将开始无限次地打印底部边框。

似乎我在管理堆栈和在方法之间返回地址时犯了一个错误,但我找不到错误的位置。一切看起来都不错!也许另一双眼睛可以提供帮助。

print_board:
    addi    $sp, $sp, -16
    sw      $ra, 12($sp)
    sw      $s2, 8($sp)
    sw      $s1, 4($sp)
    sw      $s0, 0($sp)

    # Initialize registers
    la      $s0, board
    move    $s1, $zero
    move    $s2, $zero

    # Print top of the board
    la      $a0, h_sep
    li      $v0, 4
    syscall

    # Print Row 1
    li      $a1, 0
    jal     print_line

    # Print Row 2
    li      $a1, 6
    jal     print_line

    # Print Separator
    la      $a0, h_sep
    li      $v0, 4
    syscall

    #... Print rest of rows

    # Print Bottom Border
    la      $a0, h_sep    # --> Lets call this line 100
    li      $v0, 4
    syscall

    lw      $ra, 12($sp)
    lw      $s2, 8($sp)
    lw      $s1, 4($sp)
    lw      $s0, 0($sp)
    jr      $ra          #-> At this point $ra has the memory 
                         # location of Line 100, so it just repeatedly
                         # runs that part of code.


print_line:
    addi    $sp, $sp, -16
    sw      $ra, 12($sp)
    sw      $s2, 8($sp)
    sw      $s1, 4($sp)
    sw      $s0, 0($sp)

    add     $s0, $s0, $a1

    # Print left border
    la      $a0, v_sep
    li      $v0, 4
    syscall

    # Print cell 1
    lb      $a0, ($s0)
    li      $v0, 1
    syscall

    # Print Space
    la      $a0, space
    li      $v0, 4
    syscall

    # Move to the next cell
    addi    $s0, $s0, 1

    # Print new line \n
    la      $a0, new_line
    li      $v0, 4
    syscall

    ... Print rest of cells

    # Destroy the stack
    lw      $ra, 12($sp)
    lw      $s2, 8($sp)
    lw      $s1, 4($sp)
    lw      $s0, 0($sp)
    jr      $ra

1 个答案:

答案 0 :(得分:2)

虽然我不熟悉MIPS程序集,但看起来当你在堆栈上创建空间(addi $sp, $sp, -16)时,你完成后就不会释放它。大概类似于addi $sp, $sp, 16