$8 through $15
== $t0 through $t7
Most assembly programs, like most higher-level language programs, are collections of subroutines. The main program calls upon a sequence of subroutines to accomplish its task. And, of course, subroutines themselves may call other subroutines. (In Java, software is collected into objects, and the equivalent of a subroutine is a method.)
that are not used anywhere but in the subroutine.
The temporary registers
and the saved registers
are used for local variables
(or for the same idea in assembly language).
When you write a program the temporary registers and saved registers are yours to use however you want. But, by software convention, the temporary registers may be changed by any subroutine you call. The saved registers are not changed by a subroutine call. Here is an example:
ori $t0,$0,32 # load 32 into a temp register ori $s0,$0,13 # load 13 into a saved register jal subrout # subroutine call (don't worry about # the details of this, now). sll $0,$0,0 # branch delay slot back: addu $s0,$s0,$t0 # return from subroutine; # temp register $t0 may have changed. # saved register $s0 has not changed.
is in error.
The temporary register
may have been changed by
It might not contain the value
32 that the first statement put in it.
If the programmer of
subrout did not use
it will not change.
However, in the future,
subrout might be changed to
and that would break the above code.
Is the following code fragment correct?
ori $s0,$0,13 # load 13 into a saved register ori $s1,$0,45 # load 45 into a saved register jal subrout # subroutine call (don't worry about # the details of this, now). sll $0,$0,0 # branch delay slot back: addu $s0,$s0,$s1 # return from subroutine