EXAMPLES - SOURCE CODE


EXAMPLE 1 - SIMPLE ARITHMETIC and LOAD/STORE VALUES


###########################################################
#  This program will ask for two integers and then it
#  adds and subtracts them.
#  It demostrates how to use arithmetic operations, and
#  how to load and store values.
###########################################################

        .text
        .globl  main

main:   li      $v0,4           # system call to print MSG1
        la      $a0, MSG1
        syscall

        li      $v0,5           # system call to get integer1
        syscall 

        la      $t5, INPUT1
        sw      $v0, 0($t5)     # store integer in t5

        li      $v0,4           # system call to print MSG2
        la      $a0, MSG2
        syscall

        li      $v0,5           # system call to get integer2
        syscall

        la      $t6, INPUT2
        sw      $v0, 0($t6)     # store integer2 in $t6

        lw      $t0, 0($t5)     # load values in $t0 and $t1
        lw      $t1, 0($t6)
        

        li      $v0,4           # system call to print SUM        
        la      $a0, SUM
        syscall
        add     $t3, $t0, $t1   # add $t0 and $t1
        li      $v0,1           # system call to print result
        move    $a0, $t3        # copy value to $a0
        syscall

        li      $v0,4           # system call to print SUB        
        la      $a0, SUB
        syscall
        sub     $t4, $t0, $t1   # subtract $t1 from $t0
        li      $v0,1           # system call to print result
        move    $a0, $t4        # copy value to $a0
        syscall


        li      $v0,10          # system call 10; exit
        syscall

        .data
MSG1:   .asciiz "Enter the 1st number => "
MSG2:   .asciiz "Enter the 2nd number => "
SUM:    .ascciz "Integer1 + Integer2 = "
SUB:    .ascciz "Integer1 - Integer2 = "

# a word boundary alignment
        .align 2

# reserve a word space
INPUT1: .space 4
INPUT2: .space 4

EXAMPLE 2 - LOOPS


###########################################################
#  THIS PROGRAM WILL ASK YOU FOR A NUMBER, AND THEN IT WILL
#  COMPUTE THE SUM 1 TO N.
#  IT DEMOSTRATES HOW TO IMPLEMENT LOOPS
###########################################################

        .text
        .globl  main
main:
        li      $v0,4           # mesg1 asking for a number
        la      $a0, msg1
        syscall
        li      $v0,5           # system call that reads an integer
        syscall 
        move    $t0,$v0

        li      $t1, 0          # initialize loop counter 
        li      $t2, 0          # initialize total sum to 0

loop:   addi    $t1, $t1, 1     # increment loop counter by 1
        add     $t2, $t2, $t1   # update value of sum
        beq     $t0, $t1, exit  # if if counter = N, goto exit label
        j       loop            # otherwise loop again

exit:   li      $v0, 4          # print mesg2
        la      $a0, msg2
        syscall

li      $v0,1                   # print sum
        move    $a0, $t2
        syscall
        li      $v0,4           # print an end of line
        la      $a0, cr
        syscall
        li      $v0,10          # exit
        syscall
        .data

msg1:   .asciiz "Emter a integer number:  "
msg2:   .asciiz "The sum  =   "
cr:     .asciiz "\n"


EXAMPLE 3 - FUNCTION CALLS

###########################################################
# This program calculates the factorial of N
# It demostrates how to implement function calls. 
###########################################################

        .text
        .globl main
main:   
        subu    $sp, $sp, 32            # 32-byte stack frame
        sw      $ra, 20($sp)            # save return address
        sw      $fp, 16($sp)            # save frame pointer
        addu    $fp, $sp, 32            # set new frame pointer
        
START:  
        la      $a0, str_1              # system call to print str_1  
        li      $v0, 4                 
        syscall         

        li      $v0, 5                  # system call to read an integer
        syscall

        beq     $v0, $0, EXIT           # check if integer > 0


        move    $a0, $v0                # $v0 keeps the input value
        jal     FACT                    # call fact(), ra <- next PC
        la      $a1, result             # result is stored in $v0
        sw      $v0, 0($a1)             # store the value into memory


        la      $a0, str_2              # system call to print str_2
        li      $v0, 4                  # call number 4
        syscall
                                            
        la      $a1, result             # read the value from memory
        lw      $a0, 0($a1)             # move fact result to $a0
        li      $v0, 1                  # print the result
        syscall
        j       START

EXIT:   

        la      $a0, str_3
        li      $v0, 4                  # system call to print str_3
        syscall
        
        lw      $ra, 20($sp)            # restore return address
        lw      $fp, 16($sp)            # restore frame pointer
        addu    $sp, $sp, 32            # adjust stack pointer
        jr      $ra                     # return to caller 'main'
        jr      $ra
        
FACT:   
        subu    $sp, $sp, 32            # 32-byte stack frame
        sw      $ra, 20($sp)            # save return address
        sw      $fp, 16($sp)            # save frame pointer
        addu    $fp, $sp, 32            # set up a new frame pointer    
        sw      $a0, 0($fp)             # save fact(n) function argument n
        
        lw      $2, 0($fp)              # read fact(n) function argument n
        bgtz    $2, Loop2               # branch if n>0
        li      $2, 1                   # fact(0) = 1
        j       Loop1

Loop2:  lw      $3, 0($fp)              # read fact(n) function argument n
        subu    $2, $3, 1               # n <- n-1
        move    $a0, $2         
        jal     FACT

        lw      $3, 0($fp)              # read fact(n) function argument n
        mul     $2, $2, $3              # compute fact(n-1)*n

Loop1:  lw      $ra, 20($sp)
        lw      $fp, 16($sp)
        addu    $sp, $sp, 32
        jr      $ra

        .data
str_1:  .asciiz "Enter the number for factorial(0 to exit) => "
str_2:  .asciiz "The factorial result is  "
str_3:  .asciiz "\n"
        
        .align 2
result: .space 4