.text # start program segment .align 2 # align at word boundary .globl main # main is global symbol .ent main 2 # entry at main main: # subroutine to calculate sum of # squires of numbers from 0 to 5 subu $sp, 32 # manipulate stack pointer sw $31, 20($sp) # save return address sd $4, 32($sp) # save register 4 and 5 sw $0, 24($sp) # Clear result location (p1) sw $0, 28($sp) # Clear number value (p2) loop: # begin a loop lw $14, 28($sp) # load second parameter p2 mul $15, $14, $14 # obtain p2 * p2 lw $24, 24($sp) # get first parameter p1 addu $25, $24, $15 # add p2*p2 to p1 sw $25, 24($sp) # store p1 addu $8, $14, 1 # increment value sw $8, 28($sp) # store p2 back ble $8, 5, loop # compare and continue if not done la $4, str # load adress of string in register 4 lw $5, 24($sp) # load result in register 5 jal printf # Go to a subroutine to print the result move $2, $0 # clear register 2 lw $31, 20($sp) # load return address addu $sp, 32 # reset stack pointer itself: # get stuck address j itself # loop here jr $31 # return through register $31 printf: # print routine jr $31 # We do not support print, so return .end main # done with code # define data segment .data # assembler directive .align 0 # byte boundary str: # starting symbol .asciiz "The sum from 0 .. 5 is %d\n" # string definition .end # end program