我正在尝试在MIPS程序集中创建一个递归的数独求解器。我们有一个mars工具,它为地址0xFFFF8000,0xFFFF8001中的每个单元存储字节,依此类推。我试图将保存在每个地址中的字节存储到一个数组中,但我不确定如何。 这是我尝试过的,但它在sb调用时编译说它超出界限。守则尚未完成; _printBoard只是将电路板打印到控制台;虽然最终目标是通过将已解决的字节保存回地址而将电路板显示回火星工具,但我得到了未解决的电路板。
.data
newLine: .asciiz "\n"
threeLines: .asciiz "\n\n\n"
buffer: .space 100
array: .byte
.text
_startProgram:
jal _printBoard #prints unfinished board
_sudokuSolver:
la $a0, threeLines
addi $v0, $zero, 4
syscall # print new Line
li $t0, 0xFFFF8000
lb $t1, array
sb $t0, 0($t1) # DOESNT COMPILE
li $v0, 1
add $a0, $t1, $zero
syscall #prints int in $t0
jal _printBoard #prints solved board
答案 0 :(得分:0)
好的,我解决了我的问题;但是因为我是初学者,所以可能有更好的或替代的方法来做到这一点。
所以在.data中我声明了数组
array:.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
它为我想要存储的值保留了足够的位置(总共81个)。然后我创建了一个简单的循环,我在其中加载了我想要的第一个值的地址以及我希望将其保存到的数组中的第一个值。
li $t0, 0xFFFF8000
la $t1, array
并且包含循环
lb $t2, 0($t0)
sb $t2, 0($t1)
在循环中将t0和t1加1以增加位置并在将值保存81次后打破循环。 lb在0xFFFF8000($ t0)中加载我想要的字节,并将sb保存在数组中所需的地址($ t1)。
当我想将已解决的数据保存回0xFFFF8000等地址/即时(不知道如何以不同的方式引用)时,您只需要反转正在加载/保存的内容。由于某种原因,我无法为它做一个循环所以我只是硬编码可能不是很有效的保存,所以我可能会发布另一个关于它是如何工作的问题,因为我很好奇为什么我的循环不会&# 39;为那个例子工作。
不要发布整个代码,因为这是一个类;我只问过,因为我不确定如何处理immediates并将它们保存到阵列中。事实证明我只是不需要考虑它与缓冲区/字符串不同而且我能够很容易地解决它。当时我真的很困惑,为什么我以前的状态出错了。