# # loop example from class # .text .globl main main: # # opening linkage (save return address) # addi $sp,$sp,-4 sw $ra,0($sp) # # C code: # int i = 0 # int j = 1 # int k = 1 # int a[4] = { 1, 1, 1, 2 } # # while (a[i] == k) { # i = i + j # } # # C code rewritten to use goto # # Loop: # if (a[i] != k) goto End: # i = i + j # goto Loop: # End: # # registers: # i $s3 # j $s4 # k $s5 # &a $s6 # # initialize registers addi $s3, $zero, 0 addi $s4, $zero, 1 addi $s5, $zero, 1 la $s6, a # loop Loop: sll $t1, $s3, 2 # $t1 <- 4*i add $t1, $t1, $s6 # $t1 <- &a[i] lw $t0, 0($t1) # $t0 <- a[i] bne $t0, $s5, End add $s3, $s3, $s4 # i = i + j j Loop End: # print value of i (with newline) addi $a0, $s3, 0 # i li $v0, 1 # print int syscall la $a0, nl li $v0, 4 # print string # # closing linkage (get return address and restore stack pointer) # lw $ra,0($sp) addi $sp,$sp,4 jr $ra .end main # # area for variables and constants # # example: .data a: .word 1, 1, 1, 2 # int a[4] nl: .asciiz "\n"