예제 #1
0
 public void InitRegisters()
 {
     availableRegisters = new List <MIPSRegister>();
     for (int i = 0; i < gpRegisters.Length; i++)
     {
         availableRegisters[i] = new MIPSRegister(gpRegisters[i]);
     }
 }
예제 #2
0
        public MIPSRegister GetRegister()
        {
            if (availableRegisters.Count == 0)
            {
                throw new Exception("No more registers!");
            }

            MIPSRegister reg = availableRegisters[0];

            availableRegisters.RemoveAt(0);
            return(reg);
        }
예제 #3
0
 public void EmitMalloc(MIPSRegister reg, short numbytes)
 {
     // put v0 + a0 on the stack
     EmitLoadStore("sw", "$v0", -4, "$sp");
     EmitLoadStore("sw", "$a0", -8, "$sp");
     // set v0 to 9 - sbrk
     EmitImmediate("addi", "$v0", "$zero", 9);
     // set a0 to num bytes
     EmitImmediate("addi", "$a0", "$zero", numbytes);
     // call syscall
     Emit("syscall");
     // put the returned address in v0 to reg
     Emit("add", reg, "$zero", "$v0");
     // restore v0 and a0
     EmitLoadStore("lw", "$v0", -4, "$sp");
     EmitLoadStore("lw", "$a0", -8, "$sp");
 }
예제 #4
0
 public void ReleaseRegister(MIPSRegister reg)
 {
     availableRegisters.Insert(0, reg);
 }
예제 #5
0
 public void EmitLabelJump(string mnemonic, MIPSRegister s, MIPSRegister t, string label)
 {
     EmitLabelJump(mnemonic, s.Name, t.Name, label);
 }
예제 #6
0
 public void EmitImmediate(string mnemonic, MIPSRegister t, MIPSRegister s, short C)
 {
     EmitImmediate(t.Name, s.Name, C);
 }
예제 #7
0
 public void Emit(string mnemonic, MIPSRegister s, MIPSRegister t)
 {
     Emit(mnemonic, s.Name, t.Name);
 }
예제 #8
0
 public void Emit(string mnemonic, MIPSRegister d, MIPSRegister s, string t)
 {
     Emit(mnemonic, d.Name, s.Name, t);
 }
예제 #9
0
 public void Emit(string mnemonic, MIPSRegister d, string s, MIPSRegister t)
 {
     Emit(mnemonic, d.Name, s, t.Name);
 }
예제 #10
0
 public void Emit(string mnemonic, MIPSRegister d, int C)
 {
     Emit(string.Format("{0} {1},{2}", mnemonic, d.Name, C));
 }
예제 #11
0
 public void EmitLoadStore(string mnemonic, MIPSRegister t, short C, MIPSRegister s)
 {
     EmitLoadStore(mnemonic, t.Name, C, s.Name);
 }