6
2
50
100
1100
4101
8100
3100
7200
2100
0008
0005
Donde:
Línea 01: No. de instrucciones
Línea 02: No. de datos
Línea 03: Dirección inicial de instrucciones
Línea 04: Dirección inicial de datos
A partir de la línea 5 vienen las instrucciones y después los datos
Espero puedan ayudarme!
Código
#include <iostream> #include <fstream> #include <string> using namespace std; void generarCicloFetch(); void imprimirMem(); void deleteMem(); void ejecutarMem(); void escribirMem(); string conc(int ac_2, unsigned int numb_digit); void buscarInstSig(); void buscarInstPast(); void guardarInstPast(); void saltoDireccion(); void cargaAC(); void imprimir_PC_IR_AC(); fstream archivoEntrada; ofstream archivoSalidaFetch; ofstream archivoSalidaMem; ofstream archivoSalidaAC; string nombre; string linea; string stroper; string strdirdat; string str_ir, str_ac, str_pc; const int cols = 2; int filas; int countlines = 0, i = 1, j = 0, i2, count_inst = 0, ciclos = 0, numb_inst = 0, numb_dat = 0, dirini_inst = 0, dirini_dat = 0, dir, pc, ac, ir, oper, numb_inst_past=0; bool inst_captured = false, mem_made = false, ejecutarPrograma = true, imprimirCabecera_PC_IR_AC = false; string **mem = new string*[filas]; string *inst_past = new string[numb_inst]; int main() { generarCicloFetch(); //cout << "\n\nmemoria\n" << mem[0][0] << " " << mem[0][1] << endl; //imprimirMem(); //deleteMem(); /*escribirMem(); escribirMem();*/ ejecutarMem(); cout << endl; system("pause"); return 0; } void generarCicloFetch(){ cout << "Escribe el nombre del archivo de texto.\nEscribe tambien la extension (.txt): "; fflush(stdin); getline(cin, nombre); archivoEntrada.open(nombre.c_str(), ios::in); if (archivoEntrada.is_open()) { archivoSalidaFetch.open("ciclofetch.txt", ios::out); archivoSalidaFetch << "Archivo: " << nombre << endl << endl; while (!archivoEntrada.eof()) { getline(archivoEntrada, linea); countlines++; switch (countlines){ case 1: numb_inst = stoi(linea); archivoSalidaFetch << "No.de instrucciones: " << numb_inst << endl; break; case 2: numb_dat = stoi(linea); archivoSalidaFetch << "No. de datos: " << numb_dat << endl; break; case 3: dirini_inst = stoi(linea); archivoSalidaFetch << "Dirección inicial de instrucciones: " << dirini_inst << endl; break; case 4: dirini_dat = stoi(linea); archivoSalidaFetch << "Dirección inicial de datos: " << dirini_dat << endl << endl; break; } if (countlines >= 5){ if (!mem_made){ filas = numb_inst + numb_dat; for (int i = 0; i < filas; i++) mem[i] = new string[cols]; mem_made = true; } if (linea.length() == 4){ if (countlines == 5){ archivoSalidaFetch << "Instrucciones" << endl; dir = dirini_inst; } /*stroper = linea[0]; strdirdat = linea.substr(1, 3);*/ if (i <= numb_inst && !inst_captured){ stroper = linea[0]; strdirdat = linea.substr(1, 3); archivoSalidaFetch << dir << " Cod: " << stroper << " Dir: " << strdirdat << endl; mem[i - 1][j] = to_string(dir); mem[i - 1][j + 1] = linea; dir++; i++; if (i > numb_inst){ inst_captured = true; i2 = i; i = 1; dir = dirini_dat; archivoSalidaFetch << "\nDatos" << endl; } } else if (inst_captured && i <= numb_dat){ archivoSalidaFetch << dir << " Valor: " << linea << endl; mem[i2 - 1][j] = to_string(dir); mem[i2 - 1][j + 1] = linea; dir++; i++; i2++; } } } } archivoEntrada.close(); archivoSalidaFetch.close(); cout << "\nArchivo de salida (ciclofetch.txt) creado con exito..." << endl; } else cout << "\nArchivo inexistente o faltan permisos para abrirlo" << endl; } void imprimirMem(){ cout << "\n\nMemoria" << endl << endl; for (int i = 0; i < filas; i++){ for (int j = 0; j < cols; j++){ cout << mem[i][j] << " "; } cout << endl; } } void deleteMem(){ // Clean Up /*for (int i = 0; i < filas; i++) delete [] mem[i];*/ //delete [] mem; } void ejecutarMem(){ if (ciclos == 0){ pc = dirini_inst; buscarInstSig(); } else if (ciclos > 0){ buscarInstSig(); buscarInstPast(); } if (ejecutarPrograma){ if (!imprimirCabecera_PC_IR_AC){ cout << "\n\n\tPC\t|\tIR\t|\tAC" << endl; cout << " -------------------------------------------" << endl; imprimirCabecera_PC_IR_AC = true; } switch (oper) { case 0:// salto direccion imprimir_PC_IR_AC(); guardarInstPast(); ciclos++; saltoDireccion(); break; case 1:// carga AC con mem[dir] cargaAC(); imprimir_PC_IR_AC(); guardarInstPast(); pc++; ciclos++; break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; default: break; } } } string conc(int ac_2, unsigned int numb_digit){ string str; str = to_string(ac_2); while (str.length() < numb_digit){ str = "0" + str; } return str; } void escribirMem(){ archivoSalidaMem.open("memoria.txt", ios::app); for (int i = 0; i < filas; i++){ for (int j = 0; j < cols; j++){ if (j == 1){ archivoSalidaMem << " "; } archivoSalidaMem << mem[i][j]; } archivoSalidaMem << endl; } archivoSalidaMem << endl; archivoSalidaMem.close(); } void buscarInstSig(){ bool inst_found; inst_found = false; str_pc = to_string(pc); for (int i = 0; i < numb_inst && !inst_found; i++){ //str_pc = to_string(pc); if (str_pc == mem[i][0]){ str_ir = mem[i][1]; stroper = str_ir[0]; strdirdat = str_ir.substr(1, 3); oper = stoi(stroper); dir = stoi(strdirdat); inst_found = true; } } } void buscarInstPast(){ bool instpast_found; instpast_found = false; if (numb_inst_past > 0){ for (int i = 0; i < numb_inst_past && !instpast_found; i++){ //buscarInstSig(); if (str_ir == inst_past[i]){ instpast_found = true; ejecutarPrograma = false; } } } } void guardarInstPast(){ if (numb_inst_past == 0){ i = 0; } inst_past[i] = str_ir; cout << "\ninst_past[i]: " << inst_past[i] << endl; i++; numb_inst_past++; } void saltoDireccion(){ pc = dir; } void imprimir_PC_IR_AC(){ str_ac = conc(ac, 4); cout << "\t" << pc << "\t|\t" << str_ir << "\t|\t" << str_ac << endl; } void cargaAC(){ bool dat_found; dat_found = false; /*string str_pc_aux; str_pc_aux = to_string(dir);*/ for (int i = numb_inst; i < filas && !dat_found; i++){ if (strdirdat == mem[i][0]/*str_pc_aux == mem[i][0]*/){ str_ac = mem[i][1]; ac = stoi(str_ac); dat_found = true; } } }