2017-05-08 171 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