22 Jan: MIPS examples

by Carl Burch, Hendrix College, Jan 2013

Creative Commons License
22 Jan: MIPS examples by Carl Burch is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.
Based on a work at cburch.com/cs/230/reading/01-22/.

Contents

1. Testing primality
2. Measuring string length
3. Summing linked list

1. Testing primality

        addi $s0, $zero, 1031 # $s0 is n, always 1031
        addi $s1, $zero, 2    # $s1 is i, starting at 2
        la $a1, is_composite
        la $a2, is_prime
again:  mult $s1, $s1         # if n < i * i, goto done with $a0=is_prime
        mflo $t0
        slt $t1, $s0, $t0
        bne $t1, $zero, done
        add $a0, $zero, $a2
        div $s0, $s1          # if n % i == 0, goto done with $a0=is_composite
        mfhi $t0
        beq $t0, $zero, done
        add $a0, $zero, $a1
        j again               # i++; repeat from again
        addi $s1, $s1, 1
done:   li $v0, 4             # print string in $a0
        syscall
        li $v0, 10            # exit from code
        syscall

.data
is_prime:     .asciiz "prime"
is_composite: .asciiz "composite"

2. Measuring string length

        la $a0, input   # load user's string into 'input'
        li $a1, 80
        li $v0, 8
        syscall

        la $a0, input   # call strlen(input)
        jal strlen
        nop

        move $a0, $v0   # display result of strlen
        li $v0, 1
        syscall

        li $v0, 10      # exit program
        syscall

strlen: li $v0, -1      # $v0 has length - start at -1 because '\0' counted
slen_0: lb $t0, ($a0)   # load current byte, move to next
        addi $a0, $a0, 1
        bne $t0, $zero, slen_0  # if current byte isn't '\0', repeat
        addi $v0, $v0, 1        # but first increment result
        jr $ra          # return to caller
        nop

.data
input: .space 80

3. Summing linked list

lstsum: li $v0, 0           # $v0 will sum up entries
lsts_0: lw $t0, 0($a0)      # load number in current node
        lw $a0, 4($a0)      # replace $a0 with next pointer
        bne $a0, $zero, lsts_0  # repeat if next isn't NULL
        add $v0, $v0, $t0   # but first add current num into $v0
        jr $ra              # return
        nop