九种MIPS编码格式

    因为想在不借助 EJTAG 的情况下来验证 RTOS, 所以最近恨下心来想抽空写一个 Au1200 的模拟器(我一直觉得 gxemul 和 Simics 都不是很好用),于是先根据《See MIPS Run》一书总结了一下 MIPS 的编码格式(附带说一句,网上搜出的文章以及 Hennessy 的书都说 MIPS 只有 R, I, J 三种编码形式,若仔细看看新的 MIPS32 文档或《See MIPS Run》一书的第八章,便可以知道这种说法已不适用于新的情况)。

    事实上,就我对《See MIPS Run》一书第一版和第二版的总结,当前的 MIPS 编码格式总计九种,分别为:

1) 31~26, 25~00, 即 6+26 格式;

2) 31~26, 25~06, 05~00, 即 6+20+6 格式;

3) 31~26, 25~21, 20~16, 15~00, 即 6+5+5+16 格式;

4) 31~26, 25~11, 10~06, 05~00, 即 6+15+5+6 格式;

5) 31~26, 25~21, 20~18, 17~16, 15~00, 即 6+5+3+2+16 格式;

6) 31~26, 25~21, 20~16, 15~06, 05~00, 即 6+5+5+10+6 格式;

7) 31~26, 25~21, 20~16, 15~11, 10~06, 05~00, 即 6+5+5+5+5+6 格式;

8) 31~26, 25~21, 20~18, 17~16, 15~11, 10~06, 05~00, 即 6+5+3+2+5+5+6 格式;

9) 31~26, 25~21, 20~16, 15~11, 10~08, 07~06, 05~00, 即 6+5+5+5+3+2+6 格式。

 

具体定义代码如下:

 

#define FIELD(name,ebit,sbit)   name:(ebit-sbit+1)

 

//3126 2500, Instruction format 1
typedef struct {
 unsigned long FIELD(target,25,0);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT1;

 

//3126 2506 0500, Instruction format 2
typedef struct {
 unsigned long FIELD(ext,5,0);
 unsigned long FIELD(code,25,6);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT2;


//3126 2521 2016 1500
typedef struct {
 unsigned long FIELD(off,15,0);
 unsigned long FIELD(rt,20,16);
 unsigned long FIELD(rs,25,21);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT3;


//3126 2511 1006 0500
typedef struct {
 unsigned long FIELD(ext,5,0);
 unsigned long FIELD(x,10,6);
 unsigned long FIELD(code,25,11);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT4;

//3126 2521 2018 1716 1500
typedef struct {
 unsigned long FIELD(off,15,0);
 unsigned long FIELD(N0,17,16);
 unsigned long FIELD(N,20,18);
 unsigned long FIELD(rs,25,21);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT5;

 

//3126 2521 2016 1506 0500
typedef struct {
 unsigned long FIELD(ext,5,0);
 unsigned long FIELD(x,15,6);
 unsigned long FIELD(rt,20,16);
 unsigned long FIELD(rs,25,21);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT6;


//3126 2521 2016 1511 1006 0500
typedef struct {
 unsigned long FIELD(ext,5,0);
 unsigned long FIELD(shft,10,6);
 unsigned long FIELD(rd,15,11);
 unsigned long FIELD(rw,20,16);
 unsigned long FIELD(rs,25,21);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT7;


//3126 2521 2018 1716 1511 1006 0500
typedef struct {
 unsigned long FIELD(ext,5,0);
 unsigned long FIELD(shft,10,6);
 unsigned long FIELD(rd,15,11);
 unsigned long FIELD(N0,17,16);
 unsigned long FIELD(N,20,18);
 unsigned long FIELD(rs,25,21);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT8;


//3126 2521 2016 1511 1008 0706 0500
typedef struct {
 unsigned long FIELD(ext,5,0);
 unsigned long FIELD(rx,7,6);
 unsigned long FIELD(M,10,8);
 unsigned long FIELD(fs,15,11);
 unsigned long FIELD(ft,20,16);
 unsigned long FIELD(rs,25,21);
 unsigned long FIELD(op,31,26);
} MIPS_CFMT9;


typedef union {
 unsigned long code;
 MIPS_CFMT1 fmt1;
 MIPS_CFMT2 fmt2;
 MIPS_CFMT3 fmt3;
 MIPS_CFMT4 fmt4;
 MIPS_CFMT5 fmt5;
 MIPS_CFMT6 fmt6;
 MIPS_CFMT7 fmt7;
 MIPS_CFMT8 fmt8;
 MIPS_CFMT9 fmt9;
} MIPS_INSTR;


#define FMT_3126_2500    fmt1
#define FMT_3126_2506_0500   fmt2
#define FMT_3126_2521_2016_1500   fmt3
#define FMT_3126_2511_1006_0500   fmt4
#define FMT_3126_2521_2018_1716_1500  fmt5
#define FMT_3126_2521_2016_1506_0500  fmt6
#define FMT_3126_2521_2016_1511_1006_0500 fmt7
#define FMT_3126_2521_2018_1716_1511_1006_0500 fmt8
#define FMT_3126_2521_2016_1511_1008_0706_0500 fmt9

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MIPS指令格式是一种常用的计算机指令格式,它采用固定长度的32位二进制编码表示。其中,MIPS指令由操作码、源寄存器号、目标寄存器号和立即数等部分组成。 首先,操作码(opcode)指示了指令的操作类型,如加法、逻辑运算等。操作码的长度通常为6位,一个MIPS指令可以根据操作码的不同实现不同的操作。 然后,源寄存器号(rs)指示了指令中的第一个操作数在寄存器文件中的位置。源寄存器号的长度也通常为5位,它决定了需要对哪个寄存器进行读取操作。 接着,目标寄存器号(rt)指示了指令中的第二个操作数在寄存器文件中的位置,以及存放运算结果的寄存器位置。目标寄存器号的长度也通常为5位。 而对于立即数(immediate)来说,它是指令中的一个常数或者字面值,用于进行一些特定的运算或者指示某些操作的位置。立即数的长度通常是16位。 根据这些不同的字段,我们可以将MIPS指令进行解析和编码。例如,对于一条简单的加法指令,它的MIPS指令格式为: opcode rs rt rd shamt funct 其中,opcode表示该指令的操作类型(如加法、减法),rs和rt分别表示两个源操作数在寄存器文件中的位置,rd表示目的寄存器的位置,shamt表示移位操作中的位移量,funct表示指示该操作码具体操作类型的另一个字段。 总之,MIPS指令格式利用固定长度的二进制编码实现了指令字段的统一和规范化,使得计算机能够高效地解析和执行各种指令。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值