#include int pt(int prog[], int cmd,int acc,int pc); int main() { int prog[] = { 2, 5, // load 5 3, 3, // mult 3 1, // print acc 4, 7, // jump 7 2, 0, // load 0 5, 11,// jz 11 2, 2, // load 2 5, 1, // jz 1 3, 4, // mul 4 1, // print 0 // stop }; int cmd, pc, acc; cmd = pc = acc = 0; while(pc != -1){ cmd = prog[pc]; switch(cmd){ case 0: //Проверка на команду остановки printf("STOP\t ACC = %d\t PC = %d",acc,pc); pc = -1; break; case 1: // Комманда 1 - вывод регистра pt(prog,cmd,acc,pc); pc++; break; case 2: // Комманда 2 - Присвоить регистру число acc = prog[pc+1];// из след ячейки памяти pt(prog,cmd,acc,pc); pc+=2; break; case 3: // Комманда 3 - Умножить регистр на число acc *= prog[pc+1];// в след ячейке памяти pt(prog,cmd,acc,pc); pc +=2; break; case 4: // Комманда 4 - Безусловный переход на указанную pt(prog,cmd,acc,pc); // ячейку памяти pc = prog[pc+1]; break; case 5: // Комманда 5 - Переход на указанную ячейку pt(prog,cmd,acc,pc);// памяти если регистр равен 0 if(acc == 0){ pc = prog[pc+1]; } else({ pc+=2; }); break; default: printf("err\n");return 1; } } return 0; } // Блок отвечающий за вывод в терминал // значиний в момент выполнения комманд int pt(int prog[],int cmd,int acc,int pc){ printf("\n"); printf("cmd: %d\n",cmd); switch(cmd){ case 1: printf("\tPrint acc\n\t\tacc = %d\n",acc); printf("\t\tcurr pc = %d",pc);break; case 2: printf("\tLoad acc\n\t\tacc = %d\n",acc); printf("\t\tcurr pc = %d",pc);break; case 3: printf("\tMult acc\n\t\tacc = %d\n",acc); printf("\t\tcurr pc = %d",pc);break; case 4: printf("\tJump to\n\t\tto = %d\n",prog[pc+1]); printf("\t\tcurr pc = %d",pc);break; case 5: if(acc==0){ printf("\tJump to if acc zero\n\t\tto = %d\n",prog[pc+1]); }else(printf("\tJump to if acc zero\n\t\tacc != 0\n")); printf("\t\tcurr pc = %d",pc); break; } printf("\n"); }