The largest element
One walk through eight words, keeping the best one seen so far and where it was, with a negative number in there to make the signed comparison matter.
Eight words sit in memory and the program walks them once, keeping the largest one it has seen so
far in $t1 and the position it was found at in $t2. One of the numbers is negative, which is
what makes the choice of comparison matter.
Sum of an array read every element and needed nothing from the ones before it. Here every pass has to compare the element against something the loop is carrying, which is the shape of every "find the best one" program there is.
You need to know: the "Arrays and strings" lecture and the "Comparing without flags" lecture. What is new here is the best so far: a register that starts as the first element and is overwritten only when the loop meets something better.
The first element is read before the loop, into $t1, so the loop itself has only seven elements
left and starts with an answer that is already right for the part of the array it has seen. Starting
$t1 at 0 instead would be a different program, one that answers 0 for an array of negative
numbers.
This loop walks by index, because it needs to remember where the best one was and a pointer does
not say that. sll $t4, $t3, 2 is the multiplication by four that C does for you inside
numbers[i]: shifting left by two multiplies by four, and every element size on this machine is a
power of two, so a shift is always what you want there.
$t1 comes out at 00000063, which is 99, and $t2 at 4, since 99 is the fifth element and the
first one is number 0. $t5 holds 60, the last element the loop looked at, and $t3 ends at 8,
which is what stopped it.
slt is the signed comparison, and the -4 in the array is why. Try changing
slt $t6, $t1, $t5 to sltu $t6, $t1, $t5, which reads the same bits as unsigned numbers: $t1
comes out at FFFFFFFC and $t2 at 1, because read that way FFFFFFFC is 4294967292 and nothing
in the array beats it.