MIPS Simulator — чтение инструкций в память (C ++)

Мне нужно прочитать 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, которые я указал … Что я делаю не так?

2

Решение

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

} InstRead;

Посмотрим, повезет ли тебе больше с этим союзом. Это будет зависеть от вашего компилятора.

1

Другие решения

Ваш код работает для меня (GCC 4.8.3 на Windows 7).

Вы можете использовать битовые операции для извлечения полей более переносимым способом:

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

По вопросам рекламы [email protected]