我正在尝试使用c ++模拟虚拟MIPS架构。在这个过程中,我必须将mips体系结构的每一行存储为struct并将其存储到vector中,这样我就可以模拟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
每一行看起来都不同,我试图找到一种在struct中表示它的通用方法。
答案 0 :(得分:7)
您应该了解这些指令在硬件中的实现方式。首先,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
内的3个结构分开(而不是复制它),则填充将对整个struct
强制执行更大的尺寸,与真实硬件相比,但是在你的情况下不应该是一个问题。