Secret Mustache

Adventures of a Scruffy Nerf Herder

MIPS

24 April 2010

Spring is in the air (finally) in Colorado and it doesn't look like we're going to get huge amounts of snow anytime soon. I was dinking around my file system to see what files I'm willing to delete thinking to myself, "can I clear up any mind clutter?" Well I was able to delete quite a bit of my old adventures from the past. However, I came across a bit of MIPS code that I wrote, I almost deleted it until I remembered somewhat recently I was able to help some poor student with his homework on one of the Ubuntu forums.

For posterity I've decided to ensconce this knowledge into a blog post.

Note to students: don't blindly copy this code, make sure you understand what its doing and why.

############################################
# Sums up the numbers (words) from 1 to 20
# Prints the numbers and then the sum
############################################
.text
.align 2
.globl main

main:
    la $t0, animas
    li $s0, 20
    jal addition
    jal print
    b end
addition:
    lw $t1 ($t0)
    move $a0, $t1
    li $v0, 1
    syscall
    li $v0, 4
    la $a0, comma
    syscall
    add $t3, $t1, $t3
    addi $s0, -1
    addi $t0, 4
    bgt $s0, $zero, addition
    jr $ra
print:
    li $v0, 4
    la $a0, msg
    syscall
    move $a0, $t3
    li $v0, 1
    syscall
    jr $ra
end:

.data
animas: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
msg: .asciiz "nThe sum is: "
comma: .asciiz ","

#########################################
# moveblk(&src,&dest,size)
# Transfers a block of words of "size"
# to a new destination
#########################################
.text
.align 2
.globl main

main:

    la $a0, src
    la $a1, dest
    li $s0, 4       # the size
    jal moveblk
    b end
moveblk:
    li $t5, 0       # counter
    la $t0, src
    lw $t1 ($t0)    # src
    sw $t1 ($t2)    # dest

    addi $t0, 4
    addi $t2, 4
    addi $t5, 1
    beq $t5, $s0, end
    jal moveblk
end:

.data
src:.word 1,2,9,6
dest .word
###################################
# sortNums - Sorts the #'s stored
# in registers $a0, $a1, $a2
###################################

.text

.align

.globl main

main:
    li $a0, 5
    li $a1, 2
    li $a2, 1
    jal sortNums
    jal print
    b end
sortNums:
    blt $a0, $a1, else
            move $t0, $a0
            move $a0, $a1
            move $a1, $t0
    else: blt $a1, $a2, else2
            move $t0, $a1
            move $a1, $a2
            move $a2, $t0
    else2: blt $a0, $a1, done
            move $t0, $a0
            move $a0, $a1
            move $a1, $t0
    done: jr $ra
print:
    li $v0, 4
    move $t0, $a0
    la $a0, msg
    syscall
    move $a0, $t0
    li $v0, 1
    syscall
    li $v0, 4
    la $a0, comma
    syscall
    move $a0, $a1
    li $v0, 1
    syscall
    li $v0, 4
    la $a0, comma
    syscall
    move $a0, $a2
    li $v0, 1
    syscall
    move $a0, $t0   # set $a0 to previous state
    jr $ra
end:
.data
msg: .asciiz "nThe sorted #'s: "
comma: .asciiz ","

#################################
# isEven function           #
#################################
.text
.align 2
.globl main

main:
    li $a0, 25              # var to test
    li $s0, 2
    jal isEven
    jal print
    b end
isEven:
    div $a0, $s0
    mfhi $t0
    beq $t0, $zero, even
    li $v0, 1               # is odd
    jr $ra
    even: li $v0, 0
            jr $ra
print:
    move $t0, $v0
    li $v0, 4
    la $a0, msg
    syscall
    li $v0, 1
    move $a0, $t0
    syscall
    jr $ra
end:

.data
msg: .asciiz "The output is: "


This entry was tagged as mips

blog comments powered by Disqus