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); } }
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); }