7

I am using something like SPIMS or MARS with syscall functions.

I am reading in a string (and it works because I can print it out) as follows:

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

However, I am having a problem accessing a single character of the string. So if I want to access the first character and print it, I am trying this:

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

If I try something like this:

la $a0, string
li $v0, 4
syscall

This prints out the whole string as string points to the whole string.

If I try something like:

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

It gives me an out of bound error. I don't understand why though - isn't a character a byte long and this just loads the first byte from the string into $a0?

Thank you

quetzalcoatl
  • 32,194
  • 8
  • 68
  • 107
darksky
  • 20,411
  • 61
  • 165
  • 254

1 Answers1

13

Looking at the documentation for the MARS syscall functions you can see that service 4, which you're using, expects $a0 to be "[the] address of null-terminated string to print", which explains the behavior you're seeing.

What you want is function 11 "print character", which prints the low-order byte as a character. In other words the following should work (not tested):

la $t0, string
lb $a0, ($t0)
li $v0, 11
syscall
user786653
  • 29,780
  • 4
  • 43
  • 53
  • 3
    IMO you should always reset registers values before executing LI. You never know what the upper half-word might have. – m0skit0 Sep 29 '11 at 11:20
  • 4
    `LI` is a pseudo-op that the assembler usually expands into `ORI $rd,$zero, low16bits` followed by `LUI $rd, hi16bits`. The full 32 bits of the destination register are correctly set after a `LI` instruction, so there is no need to manually reset the register before a `LI`. – markgz Sep 30 '11 at 00:21