Part 3: MIPS Registers
What is a CPU register?
You can think of a CPU register abstractly as a variable or by analogy a box, it's something you can store values in.
A register is a special area of storage in a CPU that is used for math (addition, subtraction), moving values, and storage of pointers (references to memory)
In hardware, they are a bunch of flip flops, which you can see here
What are the MIPS register conventions?
MIPS features 32 general-purpose registers which can be addressed using register numbers $0 through $31 or by their alternative names such as $sp, $gp, etc.
This table is adapted from this site with modifications.
|Register Number||Alternative Name||Conventional Usage|
|$0||$zero||The value zero, used to move values / NOP|
|$1||$at||(assembler temporary) reserved by the assembler|
|$2||$v0||Used to store syscall number / to store return values of function calls like eax in x86|
|$3||$v1||(value) from expression evaluation and function results|
|$4 - $7||$a0 - $a3||(arguments) first four parameters passed to a function, not expected to be saved across function calls|
|$8 - $15||$t0 - $t7||(temporaries) expected for functions to use to store temporary values, values not expected to be saved across function calls.|
|$16 - $23||$s0 - $s7||(saved values) callee saved, preserved across function calls. functions that use one of these registers are expected to save and restore previous values.|
|$24||$t8||(temporaries) the same as $t0 - $t7|
|$25||$t9||(temporaries) the same as $t0 - $t8; however, $t9 is also used to store the address of a shared library during library function calls (example printf).|
|$26 - $27||$k0 - $k1||(kernel) reserved for use by the interrupt handler|
|$28||$gp||(global pointer) points to static data area of program memory|
|$29||$sp||(stack pointer) points to the top of the stack|
|$30||$s8 / $fp||(saved value or frame pointer) pretty much the base pointer (ebp) in x86|
|$31||$ra||(return address) stores the return address during a function call|
Finally there is the program counter ($pc), which contains the current memory address of the instruction that the CPU is executing.
The table may be a lot to look at once so keep it handy. Here's a link of the table by itself for you to print out.
As a summary for the most important registers to know, $a0, $a1, $a2, and $a3 are used to pass arguments to functions, any register starting with t is temporary and thus when used, the value isn't expected to be saved across function calls, whereas any register beginning with s is saved and expected to persist across function calls.