A good answer might be:

The relevant section is filled in, below.

loop:                             # get a line
         la      $a0,line         # argument: address of buffer
         li      $a1,132          # argument: length of buffer
         jal     getline          # get line from user
         
         la      $a0,line         # if "Q"
         jal     testEnd          # return to caller
         beqz    $v0,endloop          

                                  # convert to capitals
         la      $a0,line         # argument: address of buffer
         li      $a1,132          # argument: length of buffer
         jal     convert          # convert

Subroutine getLine

Subroutine getLine is similar to several others you have seen:

# getLine -- read in a line of user input
#
# on entry:
#    $a0 -- address of input buffer
#    $a1 -- length of buffer
#
# on exit:
#    no return values

         .text
         .globl  getLine
getLine:   
         move    $t0,$a0          # save buffer address          
         la      $a0,prompt       # prompt the user
         li      $v0,4            # service 4
         syscall

         move    $a0,$t0          # restore buffer address
         li      $v0,8            # service 8
         syscall                  # read in a line to the buffer
         
         jr      $ra              # return to caller 

         .data
prompt:
         .asciiz ">"

Notice how getLine reads data into an input buffer defined external to itself. The parameters in $a0 and $a1 specify this buffer. It would be a design mistake to have getLine read into its own buffer or to hard-code the symbolic address of a buffer in another subroutine.

QUESTION 15:

Does getLine need to store a return address on the stack?