Как представить каждую строку инструкции mips в структуре c ++?

Я пытаюсь смоделировать виртуальную архитектуру MIPS с помощью C ++. Во время этого процесса мне нужно сохранить каждую строку архитектуры 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

Каждая строка выглядит по-разному, и я пытаюсь найти общий способ представить это в структуре.

4

Решение

Вы должны посмотреть, как эти инструкции реализованы в оборудовании. Прежде всего, MIPS — это RISC архитектура, и это приходит к вам на помощь, так как все инструкции имеют одинаковую длину.

Тогда MIPS имеет три типа команд, которые представлены на этом рисунке:

введите описание изображения здесь

Исходя из этого, вы можете легко разработать свою собственную структуру, используя битовые инструкции вместе с объединениями:

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 (вместо того, чтобы копировать его), заполнение будет обеспечивать больший размер для всего structпо сравнению с реальным оборудованием, но это не должно быть проблемой в вашем случае.

7

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

Других решений пока нет …