我有两个方法,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
答案 0 :(得分:2)
虽然我不熟悉MIPS程序集,但看起来当你在堆栈上创建空间(addi $sp, $sp, -16
)时,你完成后就不会释放它。大概类似于addi $sp, $sp, 16
。