mips暫存器介紹
一 概要
mips擁有32個通用暫存器,一個pc暫存器,一個HI和LO暫存器,另外協處理器也有自己的暫存器,如CP0有32個單獨的暫存器(不同的廠商可以實現自己獨特的暫存器,用MTC0 rt, rd, sel, sel進行區分),浮點協處理單元也有自己獨立的暫存器。
二 32個通用暫存器
s0–s8: By convention, subroutines must guarantee that thevalues of
these registers on exit are the same as they were on entry, either by not
using them or by saving them on the stack and restoring them before
exit. This makes them eminently suitable for use as register variables or
for storing any value that must be preserved over a subroutine call.
k0, k1: Reserved for use by an OS trap/interrupt handlers,which will use
them and not restore their original value; they are of little use toanyone
else.
gp: This is used for two distinct purposes. In the kind ofpositionindependent
code (PIC) used by Linux applications, all out-of-module
code and data references go through a table of pointers known as the
GOT (for Global Offset Table). The gp register is maintained to point to
the GOT. See Chapter 16 for details.
In regular non-PIC code (as is used by simpler embedded systems) gp
is sometimes used to point to a link-time-determined location in the midstof your static data. This means that loads and stores to data lying
within 32 KB of either side of the gp value can be performed in a single
instruction using gp as the base register.
Without the global pointer, loading data from a static memory area takes
two instructions: one to load the most significant bits of the 32-bitconstant
address computed by the compiler and loader and one to do the
data load.
To create gp-relative references, a compiler must know at compile time
that a datum will end up linked within a 64-KB range of memory locations.
In practice it can’t know; it can only guess. The usual practice is
to put small global data items (eight bytes and less in size) in thegparea
and to get the linker to complain if it still gets too big.
sp: It takes explicit instructions to raise and lower thestack pointer, so
MIPS code usually adjusts the stack only on subroutine entry and exit;
it is the responsibility of the subroutine being called to do this.spis
normally adjusted, on entry, to the lowest point that the stack will need
to reach at any point in the subroutine.Nowthe compiler can access stack
variables by a constant offset from sp. Once again, see section 11.2.1 for
conventions about stack usage.
fp: Also known as s8, a frame pointer will be used by asubroutine
to keep track of the stack if for any reason the compiler or programmer
was unable or unwilling to compute offsets from the stack pointer.
That might happen, in particular, if the programdoes things that involve
extending the stack by an amount that is determined at run time.
Some languages may do this explicitly; assembly programmers are
always welcome to experiment; and C programs that use the alloca()
library routine will find themselves doing so.
If the stack bottom can’t be computed at compile time, you can’t access
stack variables from sp, so fp is initialized by the function prologue to
a constant position relative to the function’s stack frame. Cunning use
of register conventions means that this behavior is local to the function
and doesn’t affect either the calling code or any nested function calls.
ra: On entry to any subroutine, return address holds theaddress to
which control should be returned—so a subroutine typically ends with
the instruction jr ra. In theory, any register could be used, but some
sophisticated CPUs use optimization (branch prediction) tricks, which
work better if you use a jr ra.
Subroutines that themselves call subroutines must first save ra, usually
on the stack.
詳細可以參考:see mips run.pdf
三 CP0暫存器
1. Registers used in memory management.
2. Registers used in exception processing.
3. Registers used in debug.
詳細可以參考:4KcProgMan.pdf (MD00016)和 MIPS® Architecture For Programmers Vol. III: MIPS32®/microMIPS32™ Privileged Resource Architecture (MD00090)