我需要读取一个十六进制格式的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选择位...我在做什么错?

最佳答案

union {
   unsigned int address;
   unsigned int imm : 16,
       rs : 5,
       rd : 5,
       opcode : 6;

} InstRead;

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

关于c++ - MIPS模拟器—将指令读入内存(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30517315/

10-12 20:52