2011-09-28 34 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