diff --git a/infolabs/modelingfonneiman/code.c b/infolabs/modelingfonneiman/code.c new file mode 100644 index 0000000..ec9bc15 --- /dev/null +++ b/infolabs/modelingfonneiman/code.c @@ -0,0 +1,95 @@ +#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"); +} diff --git a/infolabs/modelingfonneiman/tmp.out b/infolabs/modelingfonneiman/tmp.out new file mode 100755 index 0000000..e1bbad1 Binary files /dev/null and b/infolabs/modelingfonneiman/tmp.out differ