2017-03-23 70 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