Я пытаюсь представить 2D-головоломку как 1D-массив. В настоящее время я пытаюсь протестировать простую головоломку 2x2 с пустыми ячейками. В MIPS это определяется следующим образом:
puzzle:
.word 0, 0, 0, 0
Для теста это должно быть то, что я получаю на выходе:
+---+---+
| | |
Но вот что я получаю:
+---+---+
| | | |
Error #16: Attempt to use nonexistent memory
Fault address: 004000d0
Register contents:
$zero: 00000000 $at: 00000000 $v0: 00000004 $v1: 00000000
$a0: 00000000 $a1: 00000015 $a2: 00000002 $a3: 00000000
$t0: 00000000 $t1: 00000054 $t2: 00000000 $t3: 00000000
$t4: 00000000 $t5: 00000000 $t6: 00000000 $t7: 00000000
$s0: 00000002 $s1: 00000000 $s2: 00000015 $s3: 10000054
$s4: 00000000 $s5: 00000000 $s6: 00000000 $s7: 00000000
$t8: 00000000 $t9: 00000000 $k0: 00000000 $k1: 00000000
$gp: 00000000 $sp: 7fffeac8 $fp: 00000000 $ra: 00400188
pc: 004000d4 hi: 00000000 lo: 00000000
Current instruction: 8e620000 (at 004000d0)
Decoded instruction: lw $v0, 0($s3) (0x10000054)
Я уже провел время, просматривая отладчик и отслеживая регистры вручную, но я не понимаю, где проблема в памяти. Инструкция, которую он перечисляет, - это когда я читаю память в getElement, но я не уверен, как я мог получить доступ к памяти, которого не должен. Мне было интересно, заметил ли кто-нибудь что-нибудь не так с getElement или printTop в отношении доступа к памяти?
# Name: getElement
#
# Description: Gets the value at the specified coordinates in the puzzle.
#
# Arguments: a0 The x-coordinate
# a1 The y-coordinate
# a2 The size n
#
# Returns: The element at array[n * row + col]
#
getElement:
addi $sp, $sp, -FRAMESIZE_24
sw $ra, 16($sp)
sw $s3, 12($sp)
sw $s2, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)
move $s0, $a2 # store n
move $s1, $a0 # store row
move $s2, $a1 # store col
la $s3, puzzle # get address of array
mul $t0, $s0, $s1 # n * row
add $t1, $t0, $s2 # (n * row) + col
sll $t1, $t1, 2
add $s3, $s3, $t1
lw $v0, 0($s3)
lw $ra, 16($sp)
lw $s3, 12($sp)
lw $s2, 8($sp)
lw $s1, 4($sp)
lw $s0, 0($sp)
addi $sp, $sp, FRAMESIZE_24
jr $ra
# Name: printTop
#
# Description: Prints the top of each "row" for a given cell in a row.
# Ex:
# +---+
# top -> |\##|
# |#\#|
# |##\|
# +---+
#
# Arguments: a0 The array containing the cells in the puzzle
# a1 The size n
# a2 The current row
#
# Returns: Nothing
#
printTop:
addi $sp, $sp, -FRAMESIZE_20
sw $ra, 12($sp)
sw $s2, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)
move $s0, $a0
move $s1, $a1
move $s2, $a2
li $t1, 0 # col = 0
j top_loop
top_loop:
beq $t1, $s1, top_done
move $a0, $s2
move $a1, $t1
move $a2, $s1
jal getElement
# if empty
beq $v0, $zero, t_empty
t_empty:
# print " |"
li $v0, PRINT_STRING
la $a0, empty
syscall
addi $t1, $t1, 1
j top_loop
top_done:
lw $ra, 12($sp)
lw $s2, 8($sp)
lw $s1, 4($sp)
lw $s0, 0($sp)
addi $sp, $sp, FRAMESIZE_20
jr $ra
Редактировать: я возился с некоторым кодом и, я думаю, очень близко подошёл к работе. Я вычел размер n на 1 перед переходом в printTop и изменил beq $t1, $s1, top_done
на bgt $t1, $s1, top_done
, и теперь я получаю следующий результат:
+---+---+
| | |
Это здорово! За исключением того, что я также просто тестировал вызов printTop непосредственно в main, поэтому, когда я фактически запускаю его в цикле, я получаю следующее:
+---+---+
| | |
|
|
+---+---+
| |
|
|
+---+---+
Итак, по какой-то причине для второй строки печатается только одна ячейка, но похоже, что я больше не обращаюсь к несуществующей памяти. Любые идеи относительно того, что является причиной этого?