如何表示c ++ struct中的每个mips指令行?

时间:2013-05-27 18:19:06

标签: c++ c mips computer-architecture

我正在尝试使用c ++模拟虚拟MIPS架构。在这个过程中,我必须将mips体系结构的每一行存储为struct并将其存储到vector中,这样我就可以模拟5个阶段的管道。 我的问题是,我怎样才能代表每一条指令,例如:

Loop: ST R1 R2 //store to M[R2] the contents of R1
ADD R1 R2 R3  // R1 R2 and R3 are register
SUB R1 1
BRNZ  R1 Loop //if R1 is not 0 then loop

每一行看起来都不同,我试图找到一种在struct中表示它的通用方法。

1 个答案:

答案 0 :(得分:7)

您应该了解这些指令在硬件中的实现方式。首先,MIPS是RISC架构,这是在你的帮助下,因为所有指令都有相同的长度。

然后MIPS有三种指令类型,总结如下:

enter image description here

从这开始,您可以通过使用位打包指令和联合来轻松开发自己的结构:

struct Instruction {
  u8 opcode : 6;
  union {
    struct {
      u8 rs : 5;
      u8 rt : 5;
      u16 imm;
    } i;
    struct {
      u8 rs : 5;
      u8 rt : 5;
      u8 rd : 5;
      u8 shift : 5;
      u8 funct : 6;
    } r;
    struct {
      u32 address : 24;
    } j;
  }
};

通过这种方式,您可以轻松访问任何特定的指令类型

指令说明;

i.i.rs = ..
i.i.rt = ..
i.i.imm = ..

请注意,如果将操作码与union内的3个结构分开(而不是复制它),则填充将对整个struct强制执行更大的尺寸,与真实硬件相比,但是在你的情况下不应该是一个问题。

相关问题