# # example from class # .text .globl main main: # # opening linkage (save return address) # addi $sp,$sp,-4 sw $ra,0($sp) # # C code: # while (a[i] == k) # i = i + j; # } # C code rewritten with goto: # # Loop: if (a[i] != k) goto End: # i = i + j # goto Loop # End: # # register usage: # # $s0 &a la $s0, a # $s1 i (initially 0) addi $s1, $zero, 0 # $s2 j (1) addi $s2, $zero, 1 # $s3 k (0) addi $s3, $zero, 0 # Loop: add $t0, $s1, $zero # $t0 <- i sll $t0, $t0, 2 # $t0 <- 4*i add $t0, $t0, $s0 # $t0 <- &a[i] lw $t1, 0($t0) # $t1 <- a[i] bne $t1, $s3, End # stop loop if a[i] != k add $s1, $s1, $s2 # i += j j Loop End: # # print result (with newline) # addi $a0, $s1, 0 li $v0, 1 syscall la $a0, nl li $v0, 4 syscall # # 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 0,0,0,0,0,0,10 nl: .asciiz "\n"