指令格式
R 类型
说明: 用于寄存器和寄存器操作
参数说明:
- Op: 指令操作码
- Rs: 第一个源操作数寄存器号,参与运算使用
- Rd: 目的操作数寄存器号,保存结果使用
- Shamt: 位偏移量,仅在位移指令使用,在此直接置0
- Func: 指令函数码,用于选择Op操作中的具体函数
例子:
- 比如加法运算,在指令操作码中,指出它是算术运算;在指令函数码中,指出它是算术运算中的加法运算
$Rd = $Rs + $Rt
I类型
说明:
- 用于短立即数和内存载入指令load操作
- 立即数,顾名思义,就是可以立即使用的数,即在指令中就给了具体的数据,而不用先给出寄存器号到寄存器中去找
参数说明:
- Op: 指令操作码
- Rs: 第一个源操作数寄存器号,参与运算使用
- Rt: 第二个源操作数寄存器号,参与运算使用
- 16位立即数: 作为数据,参与运算使用
J型指令
说明: 用于无条件跳转
参数说明:
- Op: 指令操作码
- 26位地址数: 作为地址,参与寻址使用
and、or、xor、nor(R类型)
图例
and 例子
当功能码是6’b100100时,表示是and指令,逻辑"与"运算
指令用法: add rd, rs, rt
指令作用:
- rd <- rs AND rt 。将地址为rs 的通用寄存器的值与地址为rt的通用寄存器的值进行逻辑"与"运算
- 运算结果保存到地址为rd的通用寄存器中
or 例子
当功能码是 6’b100101时,表示是or指令,逻辑"或"运算
指令用法: or rd, rs, st
指令作用:
- rd <- rs OR rt, 将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值进行逻辑"或"运算
- 运算结果保存到地址为rd的通用寄存器中
xor 例子
当功能码是6’b100110,表示是xor指令,异或运算
指令用法: xor rd, rs, rt
指令作用:
- rd <- rs XOR rt, 将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值进行逻辑"异或"运算
- 运算结果保存到地址为rd的通用寄存器中
nor 例子
当功能码是6’b100111时,表示是nor指令,或非运算
指令用法: nor rd, rs, rt
指令作用:
- rs <- rs NOR rt,将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值进行逻辑"或非"运算
- 运算结果保存到地址为rd的通用寄存器中
andi、xori指令 (I类型)
图例
andi 例子
当指令码是 6’b001100,表示是andi指令,逻辑"与"运算
指令用法: andi rt,rs, immediate
指令作用:
- rd <- rs AND zero_extended(immediate)
- 将地址为rs的通用寄存器的值与指令中立即数进行零扩展后的值与指令中立即数进行零扩展后的值进行逻辑“与”运算
- 运算结果保存到地址为rt的通用寄存器中
xori 例子
当指令码是6’b001110,表示xori指令,异或运算
指令用法: xori, rt, rs, immediate
指令作用:
- rs <- rs XOR zero_extended(immediate)
- 将地址为rs的通用寄存器的值与指令中立即数进行零扩展后的值进行逻辑"异或"运算
- 运算结果保存到地址为rt的通用寄存器
lui 指令(I类型)
图例
lui 例子
依据指令中第26 ~ 31bit指令码的值是否为6’b001111,从而判断是否是lui指令
指令用法: lui rt, immediate
指令作用:
- rt <- immediate || 0 ^ 16
- 将指令中的16bit立即数保存到地址为rt的通用寄存器的高16位
- 另外,地址为rt的通用寄存器的低16位使用0填充
sll、sllv、sra、srav、srl、srlv指令(R类型)
图例
sll 例子
当功能码是6’b000000,表示是sll指令,逻辑左移
指令用法: sll rd, rt, sa
指令作用:
- rd <- rt << sa(logic), 将地址为rt的通用寄存器的值向左移sa位,空出来的位置使用0填充
- 结果保存到地址为rd的通用寄存器中
srl 例子
当功能码事 6’b000010, 表示srl指令,逻辑右移
指令用法: srl rd, rt, sa
指令作用:
- rd <- rt >> sa(login), 将地址为rt的通用寄存器的值向右移sa位,空出来的位置使用0填充
- 结果保存到地址为rd的通用寄存器中
sra 例子
当功能码是 6’b000022,表示sra指令,算术右移
指令用法: sra rd, rt, sa
指令作用:
- rd <- rd >> sa(arithmetic) ,将地址为rt的通用寄存器的值向右移sa位,空出来的位置使用rt[31]的值填充
- 结果保存到地址为rd的通用寄存器中
sllv 例子
当功能码是 6’b000100, 表示sllv指令,逻辑左移
指令用法: sllv rd, rt, rs
指令作用
- rd <- rt << rs[4:0](logic), 将地址为rt的通用寄存器的值向左移位,空出来的位置使用0填充
- 结果保存到地址为rd的通用寄存器中
- 移位位数由地址为rs的寄存器值的第0~4bit确定
srlv 例子
当功能码 6’b000110, 表示是srlv指令,逻辑右移
指令用法: srlv rd, rt, rs
指令作用:
- rd <- rt >> rs[4:9](logic),将地址为rt的通用寄存器的值向右移位,空出来的位置用0填充
- 结果保存到地址为rd的通用寄存器中
- 移位位数由地址为rs的寄存器的第0~4bit
srav 例子
当功能码是 6’b000111,表示是srav,算术右移
指令用法: srav rd, rt, rs
指令作用:
- rd <- rt >> rs[4:0](arthmetic) ,将地址为rt的通用寄存器的值向右移位,空出来的位置使用rt[31]填充
- 结果保存到地址为rd的通用寄存器中
- 移位位数由地址为rs的寄存器值的第0~4bit确定
nop、ssnop、sync、pref指令
图例
nop、ssnop、sync 这3条指令都是R类型指令,并且 指令码都是 6’b000000,都是SPECIAL 类
pref 属于 J类型指令