next up previous
Next: Passing Parameters on the Up: Procedures Previous: Nested Procedures

Example: Procedure to Print an Integer

The MAL procedure print_int implements the puti instruction for positive integers. The number to be printed is passed by value in register $4. The procedure is called as follows:

        .data
I:      .word   # number to print
        .text
            .
            .
        lw      $4, I
        jal     print_int

The procedure uses the system stack to:

Although not required, it is good practice to save register $4. The MAL I/O instructions, such as putc, overwrite $4 and $2. By saving and restoring $4, the procedure returns $4 unchanged to the calling program.

The procedure uses temporary registers and the system stack to perform all computations and requires no memory allocation in the .data section.

#
# print_int: a procedure to print a positive integer
#   return value:   none
#   parameters:     $4, the integer to be printed
#   registers:      $12, temporary for $4 during conversion
#                   $11, ascii digits during conversion
#                   $10, number of ascii digits converted
#
print_int:
# save return address and $4 on stack
        sw      $ra, ($sp)  # save return address
        add     $sp, -4
        sw      $4,  ($sp)  # save $4
        add     $sp, -4
# initialize temporary registers
        li      $10, 0      # digit count <- 0
        move    $12, $4     # $12 <- number to print
# loop to extract least significant digit 
loop:   rem     $11,$12, 10 # $11 <- least sig digit
        add     $11, '0'    # convert digit to ascii
        sw      $11, ($sp)  # store digit on stack
        add     $sp, -4
        add     $10, 1      # increment digit count
        div     $12, 10     # shift right one digit
        bgtz    $12, loop   # repeat until ($12=0)
# loop to print digits stored on stack
print:  add     $sp, 4          
        lw      $11, ($sp)  # load digit from stack
        putc    $11         # print the digit
        sub     $10, 1      # decrement digit count
        bgtz    $10, print  # repeat until (count=0)
# restore registers and return
        add     $sp, 4
        lw      $4, ($sp)   # restore $4 from stack
        add     $sp, 4
        lw      $ra, ($sp)  # restore $ra from stack
        jr      $ra         # return to calling program



CS301 Class Account
Mon Nov 25 11:40:41 AST 1996