MiniSys 指令系统

MiniSys指令类型
        MiniSys的指令系统采用了MIPS指令集中常用的31条指令,由于MiniSys只有16根地址线,实际存储容量只有4KB ROM和4KB RAM。
        按照功能划分,31条指令被分成以下几类:
            ● 算术运算指令:完成2个操作数的算术运算,如add, addu, addi, addiu, sub, subu。
            ● 逻辑运算指令:完成2个操作数的逻辑运算和移位,如and, andi, or, ori, xor, xori, nor, sll, srl, sra, sllv, srlv, srav。
            ● 数据传送指令:完成对数据存储器的读写或将立即数传到一个寄存器,如lw, sw, lui。
            ● 条件转移指令:完成对操作数的分支条件进行判断,满足条件则转移到目标地址运行,否则顺序运行下一地址指令,如beq, bne, slt, slti, sltu, sltiu。
            ● 无条件转移指令:转移到目标地址执行,通常跳转范围比条件转移指令大,如j, jr, jal。
            ● 从指令格式上分,MiniSys的指令被划分为三类,R-类型、I-类型和J-类型,分别对应寄存器操作数、含立即数操作数和含转移地址的三种类型指令。

MiniSys指令格式
        
        ● op-操作码;rs,rt,rd-寄存器操作数;shamt-移位的位数;func-功能码;immediate-立即数;address-转移的目标地址
        ● 从表中可以看到,无论哪种类型的指令,均是32位等长指令。
        ● R-类型指令的操作码为全0,各指令功能靠指令的最低6位的功能码(func)来区别。这种类型的指令大部分都将两个源操作数放到rs, rt寄存器中,而计算后的数据放在rd寄存器中。也有部分移位指令将移位次数放在shamt中。jr指令是R-类型指令中的特例,它只有rs寄存器有效,放转移的地址。
        ● I-类型指令的操作数中其中一个是16位的立即数,由于MiniSys的数据都是32位的,所以16位的立即数将做32位扩展,如果是无符号数,则采用高16位全填0来扩展。如果是有符号数,则高16位做符号扩展,即将有符号立即数的符号位填满高16位。如16位数8085H如果是无符号数,则扩展为32位数是00008085H,如果是有符号数,则做符号扩展后,成为0FFFF8085H。
        ● J-类型指令除了6位操作码外,剩下的26位全部是转移的目标地址,要注意的是存放在指令中的地址是实际地址除以4以后的值。

指令的汇编语句格式与指令的寻址方式
        指令的汇编语句格式如下:
        [标号:] 指令助记符 第1操作数 [, 第2操作数 [, 第3操作数]] [; 注释]
        其中[ ]中的内容为可选项,标号可以是以英文字母开头的字母-数字串,标号和指令助记符都不区分字母的大小写。从上述汇编语句格式可以看到,MiniSys的指令包括1操作数指令,2操作数指令和3操作数指令。
        1操作数指令只有j、jal和jr三个无条件转移指令,唯一的操作数作为转移的目标地址除以4的值或目标地址所在的寄存器的寄存器号。
        2操作数指令只有lui指令,其第1操作数是目的操作数,第2操作数是源操作数。
        3操作数指令中通常第1操作数是目的操作数,第2和第3操作数是源操作数,但条件转移指令beq和bne除外,这两条指令中第1和第2操作数是源操作数,第3操作数是转移的相对偏移量。
        MiniSys的指令一共有3种寻址方式:
        ● 立即数寻址。指令中第3操作数可以使用16位立即数寻址方式,即直接将16位二进制数作为操作数,实际应用中可以采用10进制或16进制数,如:addi $1,$2,100。需要注意的是尽管MiniSys CPU是32位处理器,但其立即数最高位数是16位。在移位指令中,如果移位的位数用立即数表示,则该立即数只有5位2进制位。
        ● 寄存器寻址。即操作数是存放在寄存器中,指令里放的是寄存器号。如add $1,$2,$3。
        ● 寄存器相对寻址。操作数存放在数据存储器中,其有效地址由两部分组成,基地址放在一个寄存器中,偏移部分为一个16位的立即数,如lw $1,10($2)。

指令总汇
                        MiniSys的31条指令