Program processor; Uses CRT; type treg=record obozn:char; chislo:integer; end; var a:array[1..20] of string; st:string;ch:char; n,m,k:byte; reg:array[1..26] of treg; f:text; procedure autor; begin clrscr; writeln('Трсов Иван ИТ49, задание 4, вариант 16'); writeln('разработать виртуальный процессор для арифметических операций над целыми числами'); writeln('система команд-арифметические операции над содержимым регистров ввод и вывод значений регистров'); writeln('дать программу для вычисления суммы квадратов первых n натуральных чисел') end; function finish:boolean; var ch:char; begin writeln('prodoljit y or press any key'); ch:=readkey; if upcase(ch)='Y' then finish:=false else finish:=true; end; procedure fail; begin writeln('вы загрузили код:'); assign(f,'s2n.tis'); reset(f); n:=1; while not eof(f) do begin readln(f,a[n]); writeln(a[n]); n:=n+1; end; end; function FromDec(radix,n:longint):string; var s,f: String; i:integer; const digit: string[16]='0123456789ABCDEF'; begin s:=''; f:=''; repeat s:=digit[(n mod radix)+1]+s; n:=n div radix; until n=0; if (length(s) < 6) and (radix<>16) then begin for I:=length(s) to 5 do begin f:=f+'0'; end; s:=f+s; end; FromDec:=s; end; procedure Input; var i,j:1..10; s:string; k,Iv,n,r:integer; begin s:=''; for i:=1 to 10 do if reg[i].obozn=st[4+m] then if st[5+m]<>',' then begin writeln('введите число в регистр ',st[4+m]); readln(reg[i].chislo); end else begin for j:=6+m to length(st) do s:=s+st[j]; val(s,k,Iv); reg[i].chislo:=k; end; val(st[4+m],n,r); writeln(fromdec(2,10),' ',fromdec(2,n),' ',fromdec(2,0),' ',fromdec(2,0)); writeln; end; procedure Output; var i:1..10; n,r:integer; begin for i:=1 to 10 do if reg[i].obozn=st[8+m] then begin val(st[8+m],n,r); writeln(fromdec(2,20), ' ', fromdec(2,n),' ',fromdec(2,0),' ',fromdec(2,0)); writeln; writeln('число в регистре ',st[8+m],' =',reg[i].chislo); end; end; procedure Add; var s:longint; a,b,c,d,e,r:integer; i:1..10; begin s:=0;a:=0;b:=0; for i:=1 to 10 do begin if st[4+m]=reg[i].obozn then a:=reg[i].chislo; if st[6+m]=reg[i].obozn then b:=reg[i].chislo; s:=a+b; end; for i:=1 to 10 do begin if st[8+m]=reg[i].obozn then reg[i].chislo:=s; end; val(st[4+m],c,r); val(st[6+m],d,r); val(st[8+m],e,r); writeln(fromdec(2,30),' ',fromdec(2,c),' ',fromdec(2,d),' ',fromdec(2,e)); writeln; end; procedure Sub; var s:longint; a,b,c,d,e,r:integer; i:1..10; begin s:=0;a:=0;b:=0; for i:=1 to 10 do begin if st[5+m]=reg[i].obozn then a:=reg[i].chislo; if st[7+m]=reg[i].obozn then b:=reg[i].chislo; s:=a-b; end; for i:=1 to 10 do begin if st[9+m]=reg[i].obozn then reg[i].chislo:=s; end; val(st[5+m],c,r); val(st[7+m],d,r); val(st[9+m],e,r); writeln(fromdec(2,70),' ',fromdec(2,c),' ',fromdec(2,d),' ',fromdec(2,e)); writeln; end; procedure Mult; var s:longint; a,b,c,d,e,r:integer; i:1..10; begin s:=0;a:=0;b:=0; for i:=1 to 10 do begin if st[5+m]=reg[i].obozn then a:=reg[i].chislo; if st[7+m]=reg[i].obozn then b:=reg[i].chislo; s:=a*b; end; for i:=1 to 10 do begin if st[9+m]=reg[i].obozn then reg[i].chislo:=s; end; val(st[5+m],c,r); val(st[7+m],d,r); val(st[9+m],e,r); writeln(fromdec(2,40),' ',fromdec(2,c),' ',fromdec(2,d),' ',fromdec(2,e)); writeln; end; procedure Divis; var s:longint; a,b,c,d,e,r:integer; i:1..10; begin s:=0; a:=0; b:=1; for i:=1 to 10 do begin if st[5+m]=reg[i].obozn then a:=reg[i].chislo; if st[7+m]=reg[i].obozn then b:=reg[i].chislo; s:=Round(a div b); end; for i:=1 to 10 do begin if st[9+m]=reg[i].obozn then reg[i].chislo:=s; end; val(st[5+m],c,r); val(st[7+m],d,r); val(st[9+m],e,r); writeln(fromdec(2,09),' ',fromdec(2,c),' ',fromdec(2,d),' ',fromdec(2,e)); writeln; end; procedure wentto; var s:string; x,Iv:integer; i:1..10; begin s:=''; for i:=4+m to length(st) do s:=s+st[i]; val(s,x,Iv); k:=x-1; writeln(fromdec(2,50),' ',fromdec(2,0),' ',fromdec(2,0),' ',fromdec(2,0)); writeln; end; procedure Uslov; var a,b,c,d,r:integer; i:1..10; f:boolean; begin f:=false; for i:=1 to 10 do begin if st[6]=reg[i].obozn then a:=reg[i].chislo; if st[8]=reg[i].obozn then b:=reg[i].chislo; end; case st[7] of '=':if a=b then f:=true; '>':if a>b then f:=true; '<':if an do begin st:=a[k]; if ord(st[1])<58 then begin m:=1; case st[2]of 'I':Input; 'A':Add; 'S':Sub; 'M':Mult; 'D':Divis; 'C':Uslov; 'O':Output; 'T':Wentto; end; end; if ord(st[1])>64 then begin m:=0; case st[1]of 'I':Input; 'A':Add; 'S':Sub; 'M':Mult; 'D':Divis; 'C':Uslov; 'O':Output; end; end; k:=k+1; end; end; procedure registr; var i:integer; begin for i:=48 to 58 do reg[i-47].obozn:=chr(i) end; BEGIN clrscr; repeat autor; registr; fail; ras; until finish;; END.