Loops in MIPS (Array Example)

 


What about loops?

Use beq and bne, just as for conditional statements, and add the j instruction.

(remove background colors)

	    # GENERAL LOOP PATTERN

# Initialize loop variable, e.g., i = 0 loop: slt ... # test loop condition, e.g., i < numVals beq/bne ... # branch based on loop condition
# do something (body of loop)
# step to make next iteration different, e.g., i++ j loop
endLoop: # is there more to do here?


Loop Example: Stepping through an Array in Memory

Assume that R is an array of int.

(remove background colors)

           C                                    FORTRAN
        -------                                 -------

        sum = 0;                                SUM = 0
                                                I = 0
        for ( i = 0; i < n; i++ )        LOOP: IF ( I .GE. N ) GOTO END
        {                                       SUM = SUM + R[I]
           sum += R[i];                         I = I + 1
        }                                       GOTO LOOP
                                         END:   ...

Notice that the condition is flipped in Fortran -- under what condition do we skip the code block?

 


MIPS Version

Assume that $s0 = i, $s1 = n, $s2 = R, $s3 = sum, and that R is an array of int.

(remove background colors)


                move $s3, $zero		# sum = 0
                move $s0, $zero		# i = 0
        LOOP:	slt $t0, $s0, $s1	# t0 is 1 if i < n; 0 if i >= n
                beq $t0, $zero, END	# goto END if i >= n
                sll $t0, $s0, 2  	# t0 = i * 4
                add $t0, $t0, $s2	# t0 is address of R[i]
                lw $t1, 0 ($t0)		# t1 = R[i]
                add $s3, $s3, $t1	# sum += R[i]
                addi $s0, $s0, 1	# i += 1 (or i++)
                j LOOP
	END:	...


Alyce Brady, Kalamazoo College