2011-09-28 47 views
5

我正在使用類似SPIMS或MARS的系統調用函數。訪問字符串中的一個字符

我讀的字符串(和它的作品,因爲我可以把它打印出來)如下:

li $v0, 8 
la $a0, string 
li $a1, 256 
syscall 

不過,我在訪問字符串的單個字符的問題。所以,如果我要訪問的第一個字符,打印出來,我想這一點:

la $t0, string 
lb $a0, ($t0) 
li $v0, 4 
sys call 

如果我嘗試這樣:

la $a0, string 
li $v0, 4 
syscall 

這樣就會打印出整個字符串作爲字符串指向整個字符串。

如果我嘗試類似:

la $a0, string 
lb $a0, ($t0) 
li $v0, 4 
syscall 

它給了我一個出界錯誤。我不明白爲什麼 - 字符不是一個字節長,這只是將字符串的第一個字節加載到$ a0中?

謝謝

回答

10

documentation爲MARS系統調用函數你可以看到,服務4,您正在使用的展望,預計$a0是「那裏的空值終止字符串打印的地址」,這解釋了你所看到的行爲。

你想要的是功能11「打印字符」,它將低位字節打印爲字符。換句話說,以下應該工作(未測試):

la $t0, string 
lb $a0, ($t0) 
li $v0, 11 
syscall 
+3

IMO你應該總是重置寄存器值執行LI之前。你永遠不知道上半部分可能有什麼。 – m0skit0

+4

'LI'是一個僞操作,彙編程序通常擴展爲'ORI $ rd,$ zero,low16bits',接着是'LUI $ rd,hi16bits'。在LI指令之後,目標寄存器的全部32位被正確設置,因此在LI之前不需要手動復位寄存器。 – markgz

+0

你絕對是對的 – m0skit0