A register is an electronic device that holds bit patterns. A general purpose register is a register that is visible to assembly language. The floating point registers, although visible to assembly language, are not regarded as general purpose registers.
Although the registers are called "general purpose", it is conventional in software to use each register for a specific purpose. This is not required by hardware. It is just a way for programmers to avoid confusion by establishing conventions. The extended assembler uses mnenomic names for registers that show how they are used.
For example, registers $8
through $15
are conventionally used to
hold temporary values.
The mnemonic name for these registers is $t0
through $t7
.
Register Number | Mnemonic Name | Register Number | Mnemonic Name | |||
---|---|---|---|---|---|---|
$0 | $zero | Permanently 0 | $24, $25 | $t8, $t9 | Temporary | |
$1 | $at | Assembler Temporary | $26, $27 | $k0, $k1 | Kernel | |
$2, $3 | $v0, $v1 | Value returned by a subroutine | $28 | $gp | Global Pointer | |
$4-$7 | $a0-$a3 | Subroutine Arguments | $29 | $sp | Stack Pointer | |
$8-$15 | $t0-$t7 | Temporary | $30 | $fp | Frame Pointer | |
$16-$23 | $s0-$s7 | Saved registers | $31 | $ra | Return Address |
As far as hardware is concerned, only registers $0 and $31 are different from the rest ($0 is always full of zeros and $31 is automatically used by some subroutine linkage instructions to hold the return address). The remaining registers are electronically identical. It is a software convention to use different sets of registers for different purposes.