【问题标题】:MIPS Simulator --- read instructions into memory (C++)MIPS 模拟器 --- 将指令读入内存 (C++)
【发布时间】:2015-05-28 21:22:16
【问题描述】:

我需要读取一个十六进制格式的 32 位地址(例如:0129ef12)并将 32 位分成 6-5-5-16 个数据包,分别代表 Opcode-Rd-Rs-Immediate。

这是我目前所拥有的:

typedef unsigned char u8;
typedef unsigned short u16;

union {
   unsigned int address;
   struct {
       u16 imm : 16;
       u8 rs : 5;
       u8 rd : 5;
       u8 opcode : 6;
   } i;
} InstRead;

InstRead.address = 0x0129ef12;

cout << hex << int(InstRead.i.opcode) << "\n";
cout << hex << int(InstRead.i.rs) << "\n";
cout << hex << int(InstRead.i.rd) << "\n";
cout << hex << int(InstRead.i.imm) << "\n";

但是,这并没有给出正确的输出...即位不是由我指定的长度 6-5-5-16 选择的...我做错了什么?

【问题讨论】:

  • 你得到什么输出?您是否尝试过逐步调试? i 成员的值是否正确?
  • 你用的是什么编译器?位字段处理不是标准化的,由编译器来实现。可能是将您指定的那些位字段填充到最近的边界。事实上,如果不是,我会感到惊讶。
  • 这里的字节序不是问题吗?

标签: c++ mips simulator 32-bit


【解决方案1】:
union {
   unsigned int address;
   unsigned int imm : 16,
       rs : 5,
       rd : 5,
       opcode : 6;

} InstRead;

看看你在那个工会中是否有更好的运气。不过,这取决于您的编译器。

【讨论】:

  • 感谢您的帮助 Aumnayan!但是这个输出仍然给了我操作码:12 rs: 12 rd: 12 imm: ef12
  • 我想完全尝试不同的方法对我来说会更好。有什么建议吗?
  • 我假设您期望 imm 中出现 0x0129,这是我所期望的数字和定义。这意味着上面提到的 Alexandre C. 的字节序问题。您可以在使用位域之前尝试字节序转换地址。
【解决方案2】:

您的代码适用于我(Windows 7 上的 gcc 4.8.3)。

您可以使用位操作以更便携的方式提取字段:

imm = address & 0xffff;
rs  = address & 0x1f0000 >> 16; 
// et cetera

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-04-07
    • 2012-11-06
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多