我需要读取一个十六进制格式的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/