2017-03-23 38 views
0

我想在MIPS程序集中制作一个递归数独求解器。我们有一个火星工具,为地址0xFFFF8000,0xFFFF8001等每个单元存储字节。我试图将保存在每个地址中的一个字节存储到一个数组中,但我不知道如何。 这是我所尝试的,但它在有人认为它超出界限的情况下进行编译。代码是非常未完成的; _printBoard只是将电路板打印到控制台;尽管最终目标是通过将解决的字节保存到地址中,从而将电路板显示回mars工具。MIPS从立即存储字节到字节数组

.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

好吧,所以我解决了我的问题;但是因为我是初学者,所以可能有更好的或者替代的方法来做到这一点。

所以在我的.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)中加载我想要的字节并将其保存在数组($ t1)中的所需地址中。

当我想将解决的数据保存回0xFFFF8000等地址/立即数(不知道如何引用这个不同)你只是反转了正在加载/保存的内容。由于某种原因,我无法为它做一个循环,所以我只是硬编码了可能效率不高的保存,所以我可能会发布有关这是如何工作的另一个问题,因为我很好奇为什么我的循环无法为此工作实例。

不想发布整个代码,因为这是一个类;我只问,因为我不确定如何处理立即数并将它们保存到数组中。事实证明,我只是不需要将它与缓冲区/字符串区别开来,我能够很容易地理解它。那时我真的很困惑,为什么我会遇到我以前遇到的出界错误。

+0

'array:.space 81'会短得多。 – Michael