3

我正在尝试使用 c++ 模拟虚拟 MIPS 架构。在此过程中,我必须将 mips 架构的每一行存储为结构并将其存储到向量中,以便我可以模拟 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

每条线看起来都不一样,我试图找到一种通用的方式来在结构中表示它。

4

1 回答 1

6

你应该看看这些指令是如何在硬件中实现的。首先,MIPS 是一种RISC架构,这需要您的帮助,因为所有指令都具有相同的长度。

那么 MIPS 有 3 种指令类型,总结在这张图上:

在此处输入图像描述

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

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 = ..

请注意,如果您将操作码与内部的 3 个结构分开union(而不是复制它),则与实际硬件相比,填充将强制为整体提供更大的大小,struct但这在您的情况下应该不是问题。

于 2013-05-27T18:32:19.313 回答