# While Loop Example # # Complete program from While Loop example on Slide 35-39 of # 03 MIPS Introduction .data save: .word 19 # save[0] = 19 .word 42 # save[1] = 42 .word 42 # save[2] = 42 .word 42 # save[3] = 42 .word 42 # save[4] = 42 .word 42 # save[5] = 42 .word 42 # save[6] = 42 .word 93 # save[7] = 93 .word -2 # save[8] = -2 k: .word 42 # number within save that we are looking for i: .word 3 # starting place within save of our search str: .asciiz "The final value of count = " newline: .asciiz "\n" .text main: # Function prologue -- even main has one subu $sp, $sp, 24 # allocate stack space -- default of 24 here sw $fp, 0($sp) # save caller's frame pointer sw $ra, 4($sp) # save return address addiu $fp, $sp, 24 # setup main's frame pointer la $s6, save # $s6 = address of save[0], beginning of array la $t0, i lw $s3, 0($t0) # $s3 = value of i la $t0, k lw $s5, 0($t0) # $s5 = value of k li $s1, 1 # $s1 = 1, to use in incrementing count add $s2, $zero, $zero # $s2 = count = 0; start count at zero LoopBegin: # Loop Test add $t1, $s3, $s3 # quadruple i to get offset for save[i] add $t1, $t1, $t1 add $t1, $t1, $s6 # compute address of save[i] lw $t0, 0($t1) # $t0 = value stored at save[i] bne $t0, $s5, LoopEnd # end loop if save[i] != k # Loop body add $s2, $s2, $s1 # count += 1 add $s3, $s3, $s1 # i++ j LoopBegin # back to start of loop LoopEnd: # Print count with a label la $a0, str # $a0 = address of start of string li $v0, 4 syscall add $a0, $s2, $zero # $a0 = value of count li $v0, 1 syscall la $a0, newline # $a0 = address of newline string li $v0, 4 syscall done: # Epilogue for main -- restore stack & frame pointers and return lw $ra, 4($sp) # get return address from stack lw $fp, 0($sp) # restore the caller's frame pointer addiu $sp, $sp, 24 # restore the caller's stack pointer jr $ra # return to caller's code