1.这篇还是稍微介绍一下cpu相关的寄存器。
手册里面说到的寄存器分两种,一种是cpu使用的(汇编中用来存放数据的),另一种是外部设备寄存器(一般用于配置功能,或者读写外部设备数据用的。),在手册中都叫寄存器,但是两种有较大区别,这里要讲的是cpu使用的寄存器,他们的作用相当于你吃饭的筷子和碗,没得筷子和碗,你就没法吃饭。cpu也是,没得寄存器,没法计算和运行啦。
2.龙芯寄存器,这是定点数寄存器,共32个,每个64位,而且有一些有特定功能。
REGISTER
NAME
USAGE
$0
$zero
常量0(constant value 0)
$1
$at
保留给汇编器(Reserved for assembler)
$2-$3
$v0-$v1
函数调用返回值(values for results and expression evaluation)
$4-$7
$a0-$a3
函数调用参数(arguments)
$8-$15
$t0-$t7
暂时的(或随便用的)
$16-$23
$s0-$s7
保存的(或如果用,需要SAVE/RESTORE的)(saved)
$24-$25
$t8-$t9
暂时的(或随便用的)
$28
$gp
全局指针(Global Pointer)
$29
$sp
堆栈指针(Stack Pointer)
$30
$fp
帧指针(Frame Pointer)
$31
$ra
返回地址(return address)
使用的时候一般使用第二列别名。第一列的名称也是可以用的。
3.其他寄存器
3.1 整数乘法寄存器HI、LO
MIPS中和整数乘除法相关的寄存器有两个:HI寄存器和LO寄存器。在64位处理器上,对于两个32位做乘法运算后,可以产生64位结果。可以临时将结果的低32位放在LO寄存器,高32位放在HI寄存器。例如下面的指令:
mult t0,t1
mflo a4
mfhi a5
上面的指令”mult t0,t1”实现的是寄存器t0和寄存器t1的乘法操作,结果的低32位存放在寄存器LO,结果的高32位存放在寄存器HI。mult中的mul代表乘法,t代表临时存储(temply)。HI和LO是特殊的寄存器,不允许程序直接使用,里面的结果要通过指令mflo和mfhi获取。“mflo a4”就是拷贝寄存器LO的值到通用寄存器a4,“mfhi a5”就是拷贝寄存器HI的值到通用寄存器a5。
HI和LO寄存器也用于除法运算结果的临时保存。除法运算结果商临时存放在寄存器LO,余数存放在寄存器HI。使用实例如下:
div t0,t1
mflo a4
mfhi a5
上面指令“div t0,t1”实现的是寄存器t0和t1的除法运算,运算结果的商存放在寄存器LO,余数存放在寄存器HI。类似于LO = t0/t1,HI = t0%t1
在HI和LO内的数据还是要通过指令mflo和指令mfhi拷贝到通用寄存器才可以使用。
4.除了定点数的,那就还有浮点数的。(一般用的很少,了解一下)
浮点寄存器编号 | 功能简介 |
f0,f2 | 用作函数返回值 |
f12−f19 | 用作传递参数 |
f24−f31 | 寄存器变量,发生函数调用时要保存 |
f1、f3-f 11 、 f11、f11、f20-$23 | 用作临时变量 |
5.协处理器的寄存器
在MIPS体系结构中,可支持多个协处理器(Co-Processor)。其中,协处理器0(简称CP0)是体系结构中必须实现的。CP0就是系统控制处理器,它起到控制CPU的作用,比如CPU配置、高速缓存控制、异常中断控制、存储单元控制、定时器、错误检测等。详细的功能请参考《user2.pdf》
这些寄存器需要特殊的指令才能操作,并且要在特权模式下。
mfc0
mtc0
mips好像是没有状态寄存器的,但是目前来看应该都放在协处理器0里面了。
6.在PMON的start.S中,开始就注释了一些寄存器的定义,比较重要
/*
* Register usage:
*
* s0 link versus load offset, used to relocate absolute adresses.
* s1 free
* s2 memory size.
* s3 free.
* s4 Bonito base address.
* s5 dbg.
* s6 sdCfg.
* s7 rasave.
* s8 L3 Cache size.
*/