【问题标题】:How represent each mips instruction line in c++ struct?如何在 c++ struct 中表示每个 mips 指令行?
【发布时间】:2013-05-22 15:05:51
【问题描述】:

我正在尝试使用 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

每一行看起来都不一样,我正在尝试找到一种通用的方式来在 struct 中表示它。

【问题讨论】:

    标签: c++ c mips computer-architecture


    【解决方案1】:

    您应该看看这些指令是如何在硬件中实现的。首先,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 = ..
    

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

    【讨论】:

    • 嘿,杰克,非常感谢您的回答。但我仍然对如何包含 LABEL 有一些疑问? ( 环形:)。我应该包含在相同的结构还是不同的结构中。如果我包含在不同的结构中,我会对如何管理它感到困惑。 @杰克
    • 该标签在 MIPS 中不存在,必须在组装阶段之前解析该标签。您需要先创建一个从标签到指令的映射,然后您将解析标签并将相应的跳转替换为正确的地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2011-09-01
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多