2016-10-05 74 views
0

我正在寫一個帶三個參數的函數。 $a0是一個正數int值,而$a1是一個數組,$a3是數組大小。我必須採取第一個參數並將其轉換爲ASCII十進制數字。然後將該數字存儲到數組中。我一直這樣做,直到沒有更多的數字要轉換。我必須返回最後一個數組地址和我存儲的最後一個ascii值(我把它放在$v0$v1中)。我究竟做錯了什麼 ?如何使用mips在數組中存儲ascii值?

uitoa:

li $t0 , 0 
li $t1 , 10 
li $t4 , 48 
li $t8 , 0 
for : 
beq $a0,$t8,finished 
div $a0,$t1 
mfhi $t2 #remainder 
mflo $a0 
add $t3,$t2,$t4 # +48 to ascii 
add $t6 , $t6 , $a1 #address of array? 
sb $t3, 0($t6) 
addi $t6,$t6,1 # increment array ? 
addi $t0, $t0 ,1 
j for 

finished: 

la $v0 , ($t6) 
la $v1 , ($t3) 
+0

* *錯*是什麼? – RamenChef

+0

它說地址超出範圍sb $ t3,0($ t6) –

回答

1

add $t6 , $t6 , $a1t6 = t6 + a1,但是這是你使用t6第一次,所以它的價值是不確定的(這幸運的是導致「超出範圍」當您嘗試寫一個字節在那裏,如果它偶然會在一些可寫的內存中結束,那麼你只會收到錯誤的結果加上一些隨機存儲器被覆蓋,導致很可能在其他地方出現各種奇怪的行爲)。

你也會這樣做add循環中每個週期(添加到先前設定t6a1地址),所以在第二個週期,你將去了,即使你設置t6零領先。

零輸入你剛纔跳到結束,但你不保存單個字符'0'到數組,也不t6t3被初始化(但使用)。

完成la v1,(t3)會讀取內存嗎?我想你只是想複製t3v1?所以使用寄存器加載(不確定mips助記符,我從來沒有學過mips asm)。

你沒有使用t0

並且通過在循環中將數字除以10得到數字,但它看起來像遞增填充數組。總體而言,它看起來像你掌握了一些你應該做的,但開始馬上發出指示。停下來一會兒,將算法分成幾行簡單的步驟,以整行註釋的形式寫入代碼,然後通過它們處理各種棘手的輸入(0,1,10,max_positive_int)並確保邏輯正確(Rubber duck programming)。在步驟中添加附加註釋,它們需要這些值,嘗試簡化它們,記下它們必須初始化的位置,併爲它們分配寄存器。

然後剩下的就意味着爲這些步驟編寫指令,並在調試器中對其進行調試,以驗證所有工作按預期進行。

順便說一句,從你的問題看來,你似乎沒有打擾在調試器中運行一次。這不是彙編編程的工作方式,尤其是如果你只是在學習。這也使你有資格提問(在提問前沒有表現出足夠的努力),雖然我不在乎,但我寧願讓downvote的人不努力去理解答案..:D

+0

我有點想知道如何解決向後寫數組,不能想到任何真正優雅的東西,因爲你不能告訴有多少字符將被存儲,所以要麼將它向後寫,並在末尾反轉,要麼從末尾寫入(a1 + a3-1),然後將內容移向a1 + 0?其他選項是將計算的數字保存到堆棧中並對它們進行計數,並在達到零後,將它們從堆棧中逐一彈出並從開始填充數組(加上我不確定v0/v1返回值的適當值是什麼,無論它是應該引用字符串的最右邊的數字,可能是)。 – Ped7g

相關問題