Nios II 寄存器
Nios II处理器包含32个通用寄存器、6个控制寄存器。该结构支持管理模式和用户模式,防止控制寄存器受到出错程序的破坏。
通用寄存器
32个通用寄存器分别为r0~r31。
寄存器 |
名字 |
功 能 |
寄存器 |
名字 |
功 能 |
r0 |
zero |
清零 |
r4 |
|
传递给函数的参数 |
r1 |
at |
汇编的临时变量寄存器 |
r5 |
|
传递给函数的参数 |
r2 |
|
函数返回值(低32位) |
r6 |
|
传递给函数的参数 |
r3 |
|
函数返回值(高32位) |
r7 |
|
传递给函数的参数 |
r8 |
|
调用者要保存的寄存器 |
r20 |
|
子程序要保存的寄存器 |
r9 |
|
调用者要保存的寄存器 |
r21 |
|
子程序要保存的寄存器 |
r10 |
|
调用者要保存的寄存器 |
r22 |
|
子程序要保存的寄存器 |
r11 |
|
调用者要保存的寄存器 |
r23 |
|
子程序要保存的寄存器 |
r12 |
|
调用者要保存的寄存器 |
r24 |
et |
为异常处理保留 |
r13 |
|
调用者要保存的寄存器 |
r25 |
bt |
为程序断点保留 |
r14 |
|
调用者要保存的寄存器 |
r26 |
gp |
全局指针 |
r15 |
|
调用者要保存的寄存器 |
r27 |
sp |
堆栈指针 |
r16 |
|
子程序要保存的寄存器 |
r28 |
fp |
帧指针 |
r17 |
|
子程序要保存的寄存器 |
r29 |
ea |
异常返回地址 |
r18 |
|
子程序要保存的寄存器 |
r30 |
ba |
断点返回地址 |
r19 |
|
子程序要保存的寄存器 |
r31 |
ra |
函数返回地址 |
在这些通用寄存器中,有些寄存器还具有供汇编程序识别的特殊名称。这些通用寄存器的功能如下。
zero寄存器(r0)总是返回0,对该寄存器写操作无效。Nios II无清零指令,常用r0对寄存器清零。
r1或at在汇编程序中常用做临时变量寄存器。
r2,r3用于存放子程序的返回值。
r4~r7用来传递4个非浮点参数给一个子程序。r4传递第一个参数,r5传递第二个参数,依此类推。若四个寄存器不够传递参数,编译器将通过堆栈来传递。
r8~r15用于子程序调用,子程序可以使用其中的值而不用保存它们。但调用者必须清楚:这些寄存器中的值可能被一次子程序调用改变,所以调用者有责任保存它们。
r16~r23用于子程序调用,子程序必须保证这些寄存器中的值在调用前后保持不变,即要么在子程序执行时不使用它们,要么使用前把它们保存在堆栈中并在退出时恢复。
r24或et在异常处理时使用。使用时,可以不恢复原来的值。该寄存器很少做其他用途。
r25或bt在程序断点处理时使用。使用时,可以不恢复原来的值。该寄存器很少作其他用途。
r26或gp是全局指针。指向静态数据区中一个运行时临时决定的地址。存取位于gp值上下32KB范围内的数据时,只需要一条以gp作为基指针的指令即可完成。
r27或sp是堆栈指针。Nios II没有专门的出栈(POP)、入栈(PUSH)指令,在子程序入口处,sp指向栈底部,以sp为基址,用寄存器基址+偏移地址的方式来访问栈中的数据。
r28或fp是帧指针,习惯上用于跟踪栈的变化和维护运行环境。
r29或ea用于保存异常处理时的程序返回地址。
r30或ba用于保存程序断点处理的程序返回地址。
r31或ra用于保存子程序调用的返回地址。
控制寄存器
6个控制寄存器分别为ct10~ct15。所有控制器都有供汇编程序识别的特殊名称,如表9.3所示。控制寄存器的访问与通用寄存器不同,只有特殊控制寄存器读/写指令指令rdctl和wrctl才可以读/写控制寄存器。控制寄存器只有在管理模式才可被访问。
寄存器 |
名 字 |
bit位意义:31…2 |
1 |
0 |
ct10 |
status |
保留 |
U |
PIE |
ct11 |
estatus |
保留 |
EU |
EPIE |
ct12 |
bstatus |
保留 |
BU |
BPIE |
ct13 |
ienable |
中断允许位 |
||
ct14 |
ipending |
中断发生标志位 |
||
ct15 |
cpuid |
唯一的处理器标识号 |
控制寄存器的功能如下所述。
status状态寄存器:只有第1位和第0位有意义。第1位U反映处理器当前状态。'1'表示处于用户态(User-mode),'0'表示处于超级用户态(Supervisor Mode);第0位PIE是处理器中断允许位,'1'表示处理器允许外设中断,'0'表示处理器禁止外设中断,PIE为1时,中断是否被处理还要看 ienable寄存器的值。
estatus寄存器:在异常处理时保存status寄存器内容。其中EPIE位被定义,它保存了status寄存器中的PIE位。异常处理程序能检测estatus寄存器,以确定处理器的异常状态。中断返回时,eret指令将estatus寄存器值复制回status寄存器,恢复异常发生前的 status内容。
bstatus寄存器:在处理断点时保存status寄存器内容。其中BPIE位被定义,它保存了status寄存器中的PIE位。当断电发生时,status寄存器将被复制到bstatus寄存器中,利用bstatus寄存器可恢复status寄存器断点之前的内容。
ienable寄存器:控制外部硬件中断的处理。寄存器中的每一位控制一个中断输入,共有32个中断输入irq0~irq31。1表示中断允许,0表示中断禁止。
ipending寄存器:其值用来表示此时哪个中断已注册。某位为1表示相应的irq输入有效且相应的中断在ienable寄存器中已被允许。
cpuid寄存器:主要是在多处理器系统中,保持一个唯一标识处理器的静态值。cpuid寄存器的值在系统创建时就已确定。
影子寄存器
指某些寄存器的镜像寄存器,用于与原始寄存器同步,但当进入某些Exception
Handler处理时,Raw寄存器值发生变化,而Shadow寄存器值不变,
这样出Handler时,Raw寄存器值可从Shadow寄存器恢复。