| sections in this module | City
                College of San Francisco - CS270 Computer Architecture Module: MIPS-III  | 
          module list | 
Problems-MIPSIII
The code for each of these problems is in the online/mipsIII
      directory. Note:
each of the programs here has a main() function that calls them. That
function, which is provided, uses the stack. For now, you will just be
writing the leaf functions (below), but you should look over the main
functions for each to see how the stack is used. We will cover non-leaf
functions in the next module.
    
arradd.s
int arradd(int result[], int arr1[], int arr2[], int nelem)
    
This function adds two arrays, placing the sum of each
      corresponding element in a third (result) array. 
#
      # arradd.s - add two arrays
        and store
      #    the sums
        of each pair of elements
      #    in a
        parallel third array
      #
      #  int arradd(int
        *result, int *arr1, int *arr2, int nelem);
      #
      #  returns 0 (fail) iff
        one of result, arr1 or arr2 is NULL
      #
          .text
          .globl
        arradd
      arradd:
          # uses one S register and needs room for ra and its arguments.
   
        li     
        $v0,0       # default failure
        status
          # fail if
        any pointer is NULL or if nelems is <= 0
         
        beq     $a0,$zero,.Larrbad
         
        beq     $a1,$zero,.Larrbad
         
        beq     $a2,$zero,.Larrbad
         
        ble     $a3,$zero,.Larrbad
          # finally
        ready to start
         
        li     
        $t7,0       # index
      .Larrloop:
         
        beq     $t7,$a3,.Larrdone   # if
        index == nelems we are done
         
        sll     $t4,$t7,2   # convert
        index to nbytes
         
        addu    $t0,$a1,$t4 # &arr1[index]
         
        lw      $t1,0($t0)  # arr1[index]
         
        addu    $t0,$a2,$t4 # &arr2[index]
         
        lw      $t2,0($t0)  # arr2[index]
          add     $v0,$t1,$t2
         
        addu    $t0,$a0,$t4 # & result[index]
         
        sw      $v0,0($t0)  #
        result[index] = $v0
         
        addi    $t7,$t7,1   # index++
         
        b       .Larrloop
      .Larrdone:
         
        li      $v0,1
      .Larrbad:
         
        jr      $ra
    
arradd_all.s, which includes a copy of arradd.s, calls it with sample arrays. The code for arradd.s and arradd_all.s is in the
      mipsIII directory.
    
encodertype
Our next example is a function to encode an R-type instruction, given its parts. It has the prototype
unsigned encodertype(int opc, int rs, int rt, int rd, int shamt, int funct)
It is, of course, a leaf.
#
      # unsigned encodertype(int
        opc, int rs, int rt, int rd, int shamt, int funct)
      #
      # on input, opc, rs, rt, rd
        are in $a0..$a4
      #    shamt,
        funct are on the stack
      #
      # we will use $t0 for the
        resulting instruction
      #    and
        $t1,$t2 for shamt, funct
      # we will NOT assume that
        the inputs are in the correct range: they will 
      # be masked!
      #
         
        .globl  encodertype
      encodertype:
          li 
        $t0,0       # start with result ==
        0
          and
        $a0,0x3f    # opc is 6 bits
          add
        $t0,$a0,$zero   # result is just opc
      #
          sll
        $t0,$t0,5   # make room for rs
          and
        $a1,0x1f    # mask rs
          or 
        $t0,$t0,$a1 # and or in rs
      #
          sll
        $t0,$t0,5   # make room for rt
          and
        $a2,0x1f    # mask rt
          or 
        $t0,$t0,$a2 # and or in rt
      #
          sll
        $t0,$t0,5   # make room for rd
          and
        $a3,0x1f    # mask rd
          or 
        $t0,$t0,$a3 # and or in rd
      #
          sll
        $t0,$t0,5   # make room for shamt
          lw 
        $t1,16($sp)  # get shamt
          and
        $t1,0x1f    # mask shamt
          or 
        $t0,$t0,$t1 # and or in shamt
      #
          sll
        $t0,$t0,6   # make room for funct
          lw 
        $t2,20($sp)  # get funct
          and
        $t2,0x3f    # mask funct
          or 
        $t0,$t0,$t2 # and or in funct
      #
      #   DONE!
         
        move    $v0,$t0
         
        jr      $ra
    
The example code for encodertype.s is in the online/mipsIII
      directory. The program includes a main function that requests each
      field from the user, then encodes the instruction and outputs it.
      No checking is done to ensure it
        is a valid R-type instruction, however.
    
    
| Prev |  This page was made entirely
                with free software on linux:   Kompozer and Openoffice.org  | 
          Next |