public void register_racodnize(AssemblyCode ac, Ins ins, RegisterFile regs, ControlUnit control)
        {
            string opcode = ac.machineCode.Substring(4, 4);

            opcode_r(opcode, control);
            string Rs = ac.machineCode.Substring(8, 4);
            int    s  = bd(Rs);

            ins.rs           = regs.reg[s];
            regs.reg_cont[s] = true;
            if (control.r_type == 1)
            {
                string Rt = ac.machineCode.Substring(12, 4);
                long   t  = bd(Rt);
                ins.rt           = regs.reg[t];
                regs.reg_cont[t] = true;

                string Rd = ac.machineCode.Substring(16, 4);
                ins.rd = bd(Rd);
                regs.reg_cont[ins.rd] = true;
            }
            else if (control.im_c == 1) // I_Type
            {
                string Rt = ac.machineCode.Substring(12, 4);
                ins.rt = bd(Rt);
                regs.reg_cont[ins.rt] = true;

                string imm = ac.machineCode.Substring(16, 16);
                ins.imm = bd(imm);
            }
            else if (control.j == 1) //JType
            {
                string imm = ac.machineCode.Substring(16, 16);
                ins.imm = bd(imm);
            }
        }
예제 #2
0
 public int exe(ControlUnit control, Memory data, RegisterFile reg)
 {
     if (control.alu_c == "halt")
     {
         return(0);
     }
     if (control.r_type == 1)
     {
         if (control.alu_c == "add")
         {
             return(rs + rt);
         }
         if (control.alu_c == "sub")
         {
             return(rs - rt);
         }
         if (control.alu_c == "slt")
         {
             if (rs - rt >= 0)
             {
                 return(0);
             }
             return(1);
         }
         if (control.alu_c == "or")
         {
             return(rs | rt);
         }
         if (control.alu_c == "nand")
         {
             return(~(rs & rt));
         }
     }
     if (control.im_c == 1)
     {
         if (control.alu_c == "add")
         {
             return(rs + imm);
         }
         if (control.alu_c == "or")
         {
             return(rs | imm);
         }
         if (control.alu_c == "slt")
         {
             if (rs - imm >= 0)
             {
                 return(0);
             }
             return(1);
         }
         if (control.alu_c == "lui")
         {
             return(imm << 16);
         }
         if (control.alu_c == "lw")
         {
             data.mem_c();
             return(data.mem[rs + imm]);
         }
         if (control.alu_c == "sw")
         {
             data.mem_c();
             data.mem[rs + imm] = reg.reg[rt];
             return(0);
         }
         if (control.alu_c == "beq")
         {
             if (rs == reg.reg[rt])
             {
                 control.jr_pc = 1;
                 control.pc    = control.pc + 1 + imm;
             }
             return(0);
         }
         if (control.alu_c == "jalr")
         {
             reg.reg[rt] = control.pc + 1;
             control.pc  = rs;
             return(0);
         }
     }
     if (control.j == 1)
     {
         if (control.alu_c == "j")
         {
             control.pc = imm;
             return(0);
         }
     }
     return(0);
 }