深入了解Nios II指令集架构
1. 背景与动机
在大多数项目中,我们无需精确掌握CPU的内部工作原理。但在某些情况下,比如为新组件(如JTAG控制器)编写驱动时,了解CPU架构的细节(如流水线、寄存器和ANSI C编译器的期望)是有益的,甚至是必要的。为了让学习更有趣,我们将设计一个精简版的RISC Nios II(Trisc3n),实现Nios II指令集架构(ISA)的一个子集,以此来研究Nios II与GCC之间的硬件 - 软件接口。
2. Nios II寄存器组织
Nios II有32个32位寄存器,不同寄存器有不同的用途:
- r0 :始终为零。
- at :用作汇编临时寄存器。
- r2和r3 :可作为函数返回值。
- r4 - r7 :作为函数参数。
- r8 - r23 :通用寄存器。
- r24 - r31 :编译器专用寄存器,通常不用于通用目的。例如,r24 = et作为异常临时寄存器,r26 = gp作为全局指针寄存器,r27 = sp作为堆栈指针,r31 = ra作为函数调用的返回地址。
3. 指令类型
Nios II使用三种指令类型:立即类型(I - type)、寄存器类型(R - type)和跳转类型(J - type)。所有指令均为32位长,具体格式如下表所示:
| Bits | 31…27 | 26…22