2016-11-24 58 views
0

我想製作一個程序,讀取幾個字符沒有特別的限制,但只需按Enter鍵(我發現Enter鍵的ascii代碼是13,糾正我,如果我是錯的)和一種「縫合」在一起。Assembly MIPS:將字符粘在一起給出的系統調用12服務

例如,如果用戶給出字符'3','4','5',程序應顯示整數'345'。所以,每個角色都應該匹配一點。

我試圖與循環如下發揮:

.text 
.globl main 
main: 

add $t0, $zero, $zero  #counter 

loop: 
    li $v0, 12   #v0 = the character that was read 
    syscall 
    subi $v0, $v0, 48   

#from the register column, I found that after the syscalls, the v0 
#register always adds 48 to the given character 

    beq $v0, 13, exit  #if Enter is given, exit from the loop 

    move $t1, $v0 #move the character to t1 

    sb $t1, ($t0)  #store the character to t0 

    addiu $t0, $t0, 1  #point to the next spot of the t0 

j loop 
exit: 

add $a0, $t0, $zero   #load the contents of t0 to a0 

li $v0, 1    #print the result 
syscall 

li $v0, 10 
syscall 

,顯示在我的awkardly編寫的代碼的錯誤是「運行時異常在0x00400020:地址超出範圍00000000的」因「存儲字節」命令。

我應該給一個抵消?

是否整個「存儲字節」thingy從根本上錯誤?

是否每次都需要given_character-48?

我該怎麼辦?

+0

我沒有在回答中寫下任何有關如何處理非本地大整數的問題,因爲這對於您當前的裝配技能IMO來說看起來有些複雜。所以我正在推動你走向「串」解決方案,但也許這不是你所期望的。 – Ped7g

+0

順便說一句,我無法弄清,爲什麼輸入'3','4','5'應該產生'347'輸出。從你的問題中不清楚你想用輸入值做什麼樣的計算......所以我只是猜測它是一個錯字。 – Ped7g

+0

它確實是一個錯字 – Coursal

回答

0

有與您的代碼少的問題,你怎麼理解的事情,一個是:

subi $v0, $v0, 48 

這將ASCII數字轉換從'0' - '9'字符轉換成價值0-9,所以你以後可以使用它作爲計算數量。

正如你想「將它拼接在一起」作爲字符串,你不想將ASCII字符轉換爲數字,只是保持原樣。


另一個是:

sb $t1, ($t0) 

這需要值從寄存器t1,並與接觸存儲器芯片的命令 「在地址t0它寫」。但t0爲零,並且內存地址0x00000000不可用於寫入。

你不能保存任意大小的計算機數據,內存的數量是有限的,所以你必須決定你想保留的最大字符串(加上你保持未壓縮的形式,所以保留的字節數你的字符串直接限制你的字符串是相同數量的ASCII字符減1,最後一個保留字符串是null-terminator)。

爲結果分配一些內存緩衝區(在數據段中),並首先執行la $t0,result_buffer

然後在最後一個字符後面(或者在保留空間用完之後,所以如果你想創建正確的安全應用程序,你還應該有一些計數器來檢查輸入字符串的最大長度)在它後面多存一個字節,零值,那麼結果是你將有空終止的字符串。


,人們可與功能li $v0, 4輸出(和a0應該再包含result_buffer地址)。 1用於打印整數,您不是從輸入構建整數。


如果你想建立的輸入,然後整數[無編碼自己的非原生長整數支持]你是有限的32B整數(你可以輸入過程中存儲到一些備用的寄存器,所以你不需要在內存中保留空間,只需在每一步中執行result = 10 * result + input),這樣您就可以輸入最大編號(如果「打印整數」適用於帶符號的數字)。


編輯:當然SPIM的/ MARS具有內置的調試器,您應該由指令步驟指令在你的代碼,看看它實際上是做什麼。雖然如果您沒有意識到您正在從該錯誤消息中寫入0x00000000,但調試它並觀看sb與目標t0 = 0可能不會響起鈴聲。

你仍然應該至少嘗試。越早了解調試器以及它如何顯示機器,您越早可以自行編寫代碼。 (SO不是調試服務,質量問題通常會被降低和關閉)。

+0

我知道我的問題並不是最明亮的,當然。我嘗試自己學習mips,沒有人幫忙就會變得困難。你似乎在裝配方面經驗豐富,說實話,因爲英語不是我的第一語言,有時候有幾個術語會超出我的頭腦。就像「result_buffer」的東西或其他一些術語一樣,它們被鬆散地翻譯成我的第一語言。我知道像你這樣的人付出努力並因爲我的問題而感到沮喪,但無論如何,我都很感謝你的幫助。我會嘗試。 – Coursal

+0

@Coursal只是繼續發佈什麼讓你感到困惑,我會嘗試解釋換一句話..關於緩衝區,彙編中的字符串是一系列字節。所以你必須有一些空閒的內存空間很少(最大字符串)。在MIPS ASM源代碼中分配少量字節的最簡單方法是在'.data'部分添加'result_buffer:.space 25' - >,它將保留25個字節,標籤'result_buffer'指向第一個字節。你也可以檢查這個答案(它適用於x86,但MIPS上的ASCII字符串相同):http://stackoverflow.com/questions/40575898/how-to-use-strings-in-emu8086/40580889#40580889 – Ped7g

相關問題