0

I am a beginner in MIPS. To my understanding string is stored using directive .asciiz in MIPS, and each character in the string is stored in a byte. In order to obtain a specific character code (decimal) in the MIPS program, I will have to use lb (load byte) instruction, and specify the byte position of the string to get back the character decimal stored in that byte.


            .text
main:       
            la     $t0, str
            move   $a0, $t0
            li     $v0, 4       #print string
            syscall 
# ---------------------------
            lb     $a0, 0(t0)   #to obtain the 1st character
            li     $v0, 1       #print it
            syscall
# ---------------------------
            li     $v0, 10
            syscall

            .data
str:        .asciiz "abcde"

If I need a program to count the number of characters in a string, the addi instruction is used which I don't seem to get it, shown in the program bellow :


            .text
main:
            la $t0, str
            la $t1, 0  #counter

            lb $a0, 0($t0)       #set $a0 to 1st character in str
# ------------------------------
loop:       beqz   $a0, breakout #if character is empty = 0 (decimal) breakout
            addi   $t0, $t0, 1   # why?
            addi   $t1, $t1, 1   # to increment counter
            lb     $a0, 0($t0)   #loads the first character in $t0
            j loop
# ------------------------------
breakout:   move   $a0, $t1
            li     $v0, 1        #print counter
            syscall
            li     $v0, 10       #system exit
            syscall

            .data
str:        .asciiz "abcde"

I assume that "addi $t0, $t0, 1" will increment the address of $t0 by 1 from 268500992 to 268500993. Does that mean that an increment in the address by one will allow me to find the next character in the string, and that the increment of 1 in the address is equivalent to an increment of a byte in the address containing the string?

Many thanks!

Edmund Chee
  • 43
  • 1
  • 6
  • Yes, MIPS (like many other CPU architectures) uses byte addressing for loads and stores. Each character in an `.asciiz` string occupy one byte. – Michael Apr 07 '20 at 10:15
  • Yes, in assembly addresses are just unsigned integers, which you can do math on like pointers in C. `addiu` is better than `addi`, though, since we don't want to check for signed integer overflow on (unsigned) pointer arithmetic.. – Erik Eidt Apr 07 '20 at 10:24

0 Answers0