一、02-Minisys-1的寄存器和指令系统(1)
主要内容
1.计算机系统层次
2.MiniSys-1寄存器组
3.Minisys-1指令的寻址方式
4.Minisys-1指令目录
5.MiniSys-1指令格式
1.计算机系统层次


最基本器件构成最基础的电路,形成有逻辑关系的逻辑门电路,门电路最终组成某种微处理器的微架构,为了处理该微微处理器指令集架构中的所有指令,此时从硬件跨越到了软件。
在软件上,最接触硬件的软件是操作系统,OS管理硬件资源后,程序设计语言设计某个应用的程序处理方法,我们现在使用的程序设计语言多是高级语言,靠近人的自然语言,然而机器只能看懂机器码,或者是汇编语言,把高级语言转换成机器语言的是编译器,有了程序设计语言我们可以去实现解决某个应用的方法,算法是用来描述该方法的。
2.设计一个CPU应该从哪里开始

软硬件交接的这一层指令集架构的确定,就确定了硬件上的微架构以及各种硬件的组成,也使得上层的软件用什么样的指令序列实现算法,从设计角度来说,最开始设计的应该是指令集架构。
3.MiniSys-1指令系统简介
Minisys-1采用32位MIPS指令中最常用的31条指令,其寄存器组织,指令格式等均采用MIPS指令系统基本相同的格式。
1.32位定长格式指令
2.5种寻址方式
3.Minisys-1在执行环境上共有32个32位寄存器
4.MiniSys-1寄存器组
| 寄存器名 | 寄存器号 | 约定用途 |
|---|---|---|
| $zero | 0 | 常数0,该寄存器永远只返回0(只读) |
| $at | 1 | 用作汇编器的暂时变量 |
| $v0~$v1 | 2~3 | 用来存放一个子程序(函数)的非浮点运算的结果或返回值 |
| $a0~$s3 | 4~7 | 存放子程序(函数)调用时的非浮点参数 |
| $t0~$t7 | 8~15 | 暂时变量,子程序(函数)使用时不保存这些计数器的值,因此调用后它们的值会被破坏 |
| $s0~$s7 | 16~23 | 8个子程序用寄存器。子程序(函数)必须在返回之前这些寄存器的值以保证没有变化 |
| $t8~$t9 | 24~25 | 暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用它们的值会被破坏 |
| $i0~$i1 | 26~27 | 分别保存两个中断到来时程序的返回地址。(该两寄存器定义和MIPS中的有所不同) |
| $gp | 28 | 全局指针 |
| $sp | 29 | 堆栈指针对它的调整必须显式的通过指针来实现,硬件不支持堆栈的调整 |
| $s8/$fp | 30 | 第9个子程序用寄存器/帧寄存器 |
| $ra | 31 | 存放调用子程序(函数)时的返回地址 |
在使用时既可以用寄存器名,也可以用寄存器号。
寄存器在子程序调用时有约定,硬件设计人员要特别注意,但不做子程序调用的话,都可作为普通寄存器。MIPS没有$i0~$i1寄存器,31号寄存器需要思考当出现程序嵌套时,如何存放返回地址。
二、02-Minisys-1的寄存器和指令系统(2)
5.Minisys-1指令的寻址方式
1.立即数寻址
指令中第3操作数可使用16位二进制立即数
(需要考虑扩展问题)
2.寄存器寻址
操作数存放在寄存器中,指令里放的是寄存器号
3.基址寻址
操作数存放在数据存储器中,其有效地址由两部分组成,基地址放在一个寄存器中 ,偏移部分为一个16位的立即数。
4.PC相对寻址
操作数是下一条指令的PC值( PC+4 )加上一个16位偏移量地址左移两位的值
为什么要左移两位
这种PC寻址都寻的是新指令的地址,而Minisys-1采用的是边界对齐的原则,每一条指令都是四个字节,每一条指令所在位置都是四的倍数才能做到自边界对齐,则二进制数最低两位都为0,即左移两位。
5.伪直接寻址
26位偏移地址左移两位(形成28位地址),最高4位为PC的高4位32位字地址 ( Minisys- 1中直接用26位偏移地址左移两位,最高4位补0 )
6.Minisys-1指令目录
1.算术指令(6)
- add, addu, addi, addiu, sub, subu
2.逻辑指令(13)
- and, andi, or, ori, xor, xori, nor, sll, srl, sra, sllv, srIv, srav
3.数据传送指令(3)
- Iw, sw, lui
4.比较、条件转移指令(6)
- beq, bne, slt, slti, sltu, sltiu
3.无条件转移指令(3)
- j, jr, jal
7.MiniSys-1指令格式
1.R-format

32位指令被分成六段,高六位为指令码,但是所有R类型的指令,它的指令码部分全部为0,区别在于最低的六位功能码。
绝大部分R类型的三个操作数都是寄存器操作数,所以都把寄存器号放进来,剩下的四个域中有三个域放寄存器号,其中rs和rt放两个原操作数的寄存器号,rd域放目的操作数的寄存器号。三操作数指令第一操作数是目的操作数,第二、第三为原操作数。
2.I-format

I类型分四个部分,最高六位依然是指令码,接下来五位是rs域,在接下来五位是rt域,最低的十六位存放十六位立即数。
MiniSys-1是定长指令格式的,没有rd域后,rs、立即数为操作数,rt为目的操作数,且立即数需要根据符号来进行三十二位扩展。
3.J-format

J类型前六位为,无条件跳转或条件跳转指令,后面二十六位放地址,要跳转的地址需要右移两位(/4),最后两位都为0,无需存放。做硬件的需要拿到地址后左移两位恢复,做编译的需要算出地址在存放时右移两位。