Я пытаюсь смоделировать виртуальную архитектуру 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
Каждая строка выглядит по-разному, и я пытаюсь найти общий способ представить это в структуре.
Вы должны посмотреть, как эти инструкции реализованы в оборудовании. Прежде всего, 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
по сравнению с реальным оборудованием, но это не должно быть проблемой в вашем случае.
Других решений пока нет …