Files
2026-02-21 10:47:00 +07:00

93 lines
3.1 KiB
C

#include <stdio.h>
void 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;
}
// Блок отвечающий за вывод в терминал
// значиний в момент выполнения комманд
void 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");
}