自己动手写CPU(7)——算术操作指令说明

简单算术操作指令(15)

add: 加法运算。结果异常溢出,不保存结果
addu: 加法运算。不进行溢出检查,直接保存结果到目的寄存器
sub: 减法运算。结果异常溢出,不保存结果
subu: 减法运算。不进行溢出检查,直接保存结果到目的寄存器
slt: 比较运算。将地址为rs的通用寄存器的值与rt中的值进行有符号数比较。若前者小于后者,将1存在目的寄存器rd中;反之,存放0
sltu: 比较运算。将地址为rs的通用寄存器的值与rt中的值进行无符号数比较。若前者小于后者,将1存在目的寄存器rd中;反之,存放0
·
clz:计数运算。对地址为rs通用寄存器的值从最高位开始向最低位方向检查,直到遇到“1”,将该位之前“0”的个数保存到rd中。若rs中的值都是0(0x0000_0000),那么将32保存在rd中
clo:计数运算。对地址为rs通用寄存器的值从最高位开始向最低位方向检查,直到遇到“0”,将该位之前“1”的个数保存到rd中。若rs中的值都是1(0xFFFF_FFFF),那么将32存放在rd中
·
mul: 乘法运算。将地址位rs和rt通用寄存器的值作为有符号数相乘,结果低32bit存在目的寄存器rd中
mult: 乘法运算。将地址为rs和rt通用寄存器的值作为有符号数相乘,结果低32bit存在LO寄存器中,高32bit存在HI寄存器中。
multu: 乘法运算。将地址为rs和rt通用寄存器的值作为无符号数相乘,结果低32bit存在LO寄存器中,高32bit存在HI寄存器中。

R型指令

op[31:26]rs[25:21]rt[20:16]rd[15:11]sa[10:6]func[5:0]
名称指令用法指令作用指令码[31:26]目的寄存器rd[15:11]移位相关[10:6]功能码[5:0]
ADDadd rd, rs, rtrd <- rs + rt6’b 00_0000rd5’b 000006’b 10_0000
ADDUaddu rd, rs, rtrd <- rs + rt6’b 00_0000rd5’b 000006’b 10_0001
SUBsub rd, rs, rtrd <- rs - rt6’b 00_0000rd5’b 000006’b 10_0010
SUBUsubu rd, rs, rtrd < -rs - rt6’b 00_0000rd5’b 000006’b 10_0011
SLTslt rd, rs, rtrd <- (rs<rt)6’b 00_0000rd5’b 000006’b 10_1010
SLTUsltu rd, rs, rtrd <- (rs<rt)6’b 00_0000rd5’b000006’b 10_1011
CLZclz rd, rsrd <- coun_leading_zeros rs6’b 01_1100rd5’b 000006’b 10_0000
CLOclo rd, rsrd <- coun_leading_ones rs6’b 01_1100rd5’b 000006’b 10_0001
MULmul rd, rs, rtrd <- rs * rt6’b 01_1100rd5’b 000006’b 00_0010
MULTmutl rs, rt{hi, lo} <- rs * rt6’b 00_00005’b000005’b 000006’b 01_1000
MULTUmultu rs, rt{hi, lo} <- rs * rt6’b 00_00005’b 000005’b 000006’b 01_1001

addi: 立即数符号扩展与地址为rs的通用寄存器的值相加,结果保存在目的寄存器rt中。结果异常溢出,不保存结果
addiu: 立即数符号扩展与地址为rs的通用寄存器的值相加,结果保存在目的寄存器rt中。不进行溢出检查,直接保存结果到目的寄存器
slti: 立即数符号扩展与地址为rs的通用寄存器的值按照有符号数进行比较。若前者小于后者,将1存在目的寄存器rd中;反之,存放0
sltiu: 立即数符号扩展与地址为rs的通用寄存器的值按照无符号数进行比较。若前者小于后者,将1存在目的寄存器rd中;反之,存放0

I型指令

op[31:26]rs[25:21]rt[20:16]immediate[15:0]
名称指令用法指令作用指令码[31:26]
ADDIaddi rt, rs, immrt <- rs+(sign_extended)imm6’b 00_1000
ADDIUaddiu rt, rs, immrt <- rs+(sign_extended)imm6’b 00_1001
SLTIalti rt, rs, immrt <- (rs<(sign_extended)imm)6’b 00_1010
SLTIUsltiu rt, rs, immrt <- (rs<(sign_extended)imm)6’b 00_1011

指令确定过程(id译码case分支走向)
1

乘累加、乘累减指令(4)

madd: 将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值作为有符号数进行乘法运算,运算结果与{HI, LO}相加,相加的结果保存在{HI, LO}
maddu:将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值作为无符号数进行乘法运算,运算结果与{HI, LO}相加,相加的结果保存在{HI, LO}
msub:将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值作为有符号数进行乘法运算,然后使用{HI, LO}减去乘法结果,相减的结果保存在{HI, LO}
msubu:将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值作为无符号数进行乘法运算,然后使用{HI, LO}减去乘法结果,相减的结果保存在{HI, LO}

R型指令
都是SPECIAL2类型的指令码

op[31:26]rs[25:21]rt[20:16]rd[15:11]sa[10:6]func[5:0]
名称指令用法指令作用指令码[31:26]目的寄存器rd[15:11]移位相关[10:6]功能码[5:0]
MADDmadd rs, rt{HI, LO} <- {HI, LO} + rs × rt6’b 01_11005’b 000005’b 000006’b 00_0000
MADDUmaddu rs, rt{HI, LO} <- {HI, LO} + rs × rt6’b 01_11005’b 000005’b 000006’b 00_0001
MSUBmsub rs, rt{HI, LO} <- {HI, LO} - rs × rt6’b 01_11005’b 000005’b 000006’b 00_0100
MSUBUmsubu rs, rt{HI, LO} <- {HI, LO} - rs × rt6’b 01_11005’b 000005’b 000006’b 00_0101

指令确定过程(id译码case分支走向)
2

除法指令(2)

div: 将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值,作为有符号数进行除法运算,将商保存到寄存器LO,余数保存到寄存器HI
divu: 将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值,作为无符号数进行除法运算,将商保存到寄存器LO,余数保存到寄存器HI

R型指令
都是SPECIAL类型的指令码

op[31:26]rs[25:21]rt[20:16]rd[15:11]sa[10:6]func[5:0]
名称指令用法指令作用指令码[31:26]目的寄存器rd[15:11]移位相关[10:6]功能码[5:0]
DIVdiv rs, rt{HI, LO} <- rs / rt6’b 00_00005’b 000005’b 000006’b 01_1010
DIVUdivu rs, rt{HI, LO} <- rd / rt6’b 00_00005’b 000005’b 000006’b 01_1011

指令确定过程(id译码case分支走向)
3

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值