2017-05-08 227 views
0

我剛開始編程MIPS assembly,我對此有幾個疑問。打印字符串(彙編)

首先,我的代碼:

.data 
word1: .ascii "Hello" 
word2: .ascii " World" 
word3: .ascii "!" 

.text 
main: 

#lw $t0, word1 
#lw $t1, word2 
#lw $t2, word3 

li $v0, 4 
la $a0, word1 
syscall 
la $a0, word2 
syscall 
la $a0, word3 
syscall 

我想問爲什麼我的消息

Runtime exception at 0x0040000c: fetch address not aligned on word boundary 0x10010005 

,而我試圖加載第二個字詞(字詞)? (我知道我沒有加載字符串。)

其次,此代碼的輸出將是「Hello World!World !!」 - word1 word2 word3 word2 word3 word3。

如果我評論第10行和第11行代碼(加載其他單詞),輸出將是Hello World!而不是Hello

爲什麼會發生?我只想打印一個字,而不是一次打印三個字。

提前致謝!

+0

附加一個「,0」給你的字符串,告訴操作系統停止字的位置 – Tommylee2k

+0

在MIPS中,你不能讀取未對齊的地址。這就是錯誤信息告訴你的。 – fuz

回答

0

的確,代碼並不知道從哪裏停下來。這就是爲什麼當您打印word1時打印word1word2word3(分別打印word2word3當您打印word2時)。我想在這三個單詞之後的內存中有一個終止符(可能是0字節),這就是爲什麼它在打印後立即停止。

你所要做的就是告訴彙編程序在每個單詞後面輸入完整的字符,如Tommylee2k所示,在每個單詞的末尾添加一個0字節。

+0

好的,但我該怎麼做?在字符串的末尾添加「,0」不起作用。 – NoName

+0

我不是MIPS專家,但我想你應該用.asciiz替換.ascii你可以參考這個鏈接來區分這兩者之間的區別:http://stackoverflow.com/questions/7783044/whats-the-difference-between -asciiz-vs-ascii –

+1

它的工作原理,非常感謝你:) – NoName