1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Виртуальный процессор, Процессор я уже накписал... помогите с программой к нему
Мне нужен был виртуальный процессор, ниже список команд есть. Надо чтобы команда была 1 байт ( включаетв в себя код операции 4 бита, и номер регистра 4 бита). Первый операнд берется из регистра, второй из сумматора.. результат в сумматор.
Написать программу для вычисления суммы первых n натуральных чисел.
т.к сумматр это тотже регистр у него есть адрес 0101 1100 0000 Переносим из сумматора в регистр 0000 команды 0001 0000 - ввод в регистр с номером 0000 если нужно ввести в сумматор указыаем номер сумматра 0010 0000 -вывод из регистра 0000 если нужно ввести в сумматор указыаем номер сумматра 0011 0000- операция сложения межу регистром 0000 и сумматром 0100 0000-операция вычитания между регистром 0000 и сумматром 0101 0000-умножения значения в регистре 0000 и сумматром 0110 0000-деление -//- 1010 0000-оператор перехода на заданную строку 0000 1001 0000 -оператор условия = между регистром 0000 и сумматром если tru то выполняем действие указанное на следующейстроке если false не выполняем действие на следующей строке и идем дальше 0111 0000 -оператор условия >между регистром 0000 и сумматром если tru то выполняем действие указанное на следующейстроке если false не выполняем действие на следующей строке и идем дальше 1000 0000-оператор условия < между регистром 0000 и сумматром если tru то выполняем действие указанное на следующейстроке если false не выполняем действие на следующей строке и идем дальше 1011 0000 Переносим из регистра в сумматор
Вот вопрос: где тут может быть ошибка... так как после того как вводиться число в программе, она выключается... завершается вообщем и ответ не выводит.
Вот код процессора:
Program processor; Uses CRT; type treg=record obozn:char; chislo:integer; end; var a:array[1..50] of string; st,st2:string;ch:char; n,m,k,t:byte; reg:array[1..26] of treg; f:text; s:string; 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,'23.txt'); reset(f); n:=1; while not eof(f) do begin readln(f,a[n]); writeln(a[n]); n:=n+1; end; end; function ToDec(n:string; radix:longint):longint; var m, i: longint; const digit: string[16]='0123456789ABCDEF'; begin m:=0; while (n[1]='0') and (length(n) > 1) do delete(n,1,1); for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1; ToDec:=m; end; procedure Input; var i,j:1..10; s,r,c:string; k,Iv,n:integer; begin s:=''; r:=''; c:=''; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do if reg[i].obozn=r then if (st[11+m]<>'0') and (st[12+m]<>'1') then begin if r='5' then writeln('ўўҐ¤ЁвҐ зЁб«® ў б㬬 в®а') else writeln('ўўҐ¤ЁвҐ зЁб«® ў ॣЁбва ',r); readln(reg[i].chislo); end; end; procedure SumReg; var i,j:1..10; s,r,c:string; k,Iv,n:integer; begin s:=''; r:=''; c:=''; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do if reg[i].obozn=r then begin reg[i].chislo:=reg[5].chislo; end; end; procedure RegSum; var i,j:1..10; s,r,c:string; k,Iv,n:integer; begin s:=''; r:=''; c:=''; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do if reg[i].obozn=r then begin reg[5].chislo:=reg[i].chislo; end; end; procedure Output; var i:1..10; n:integer; r:string; begin r:=''; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do if reg[i].obozn=r then begin if r='5' then writeln('зЁб«® ў б㬬 в®аҐ = ',reg[i].chislo) else writeln('зЁб«® ў ॣЁбвॠ',r,' =',reg[i].chislo); end; end; procedure Add; var s:longint; a,b:integer; c,d,r:string; i:1..10; begin s:=0;a:=0;b:=0; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do begin if r=reg[i].obozn then a:=reg[i].chislo; if '5'=reg[5].obozn then b:=reg[5].chislo; s:=a+b; end; for i:=1 to 10 do begin if '5'=reg[5].obozn then reg[5].chislo:=s; end; end; procedure Sub; var s:longint; a,b:integer; i:1..10; c,d,r:string; begin s:=0;a:=0;b:=0; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do begin if r=reg[i].obozn then a:=reg[i].chislo; if '5'=reg[5].obozn then b:=reg[5].chislo; s:=a-b; end; for i:=1 to 10 do begin if '5'=reg[5].obozn then reg[5].chislo:=s; end; end; procedure Mult; var s:longint; a,b:integer; i:1..10; c,d,r:string; begin s:=0;a:=0;b:=0; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do begin if r=reg[i].obozn then a:=reg[i].chislo; if '5'=reg[5].obozn then b:=reg[5].chislo; s:=a*b; end; for i:=1 to 10 do begin if '5'=reg[5].obozn then reg[5].chislo:=s; end; end; procedure Divis; var s:longint; a,b:integer; i:1..10; c,d,r:string; begin s:=0;a:=0;b:=0; str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r); for i:=1 to 10 do begin if r=reg[i].obozn then a:=reg[i].chislo; if '5'=reg[5].obozn then b:=reg[5].chislo; s:=Round( b div a ); end; writeln(s); for i:=1 to 10 do begin if '5'=reg[5].obozn then reg[5].chislo:=s; end; end; procedure wentto; var x,Iv:integer; i:1..10; begin x:=todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2); k:=x-1; end; procedure Uslov; var a,b,x:integer; i:1..10; f:boolean; r,c,d:string; begin str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r); f:=false; for i:=1 to 10 do begin if r=reg[i].obozn then a:=reg[i].chislo; if '5'=reg[5].obozn then b:=reg[5].chislo; end; case ToDec(st[1]+st[2]+st[3]+st[4],2) of 9:if a=b then f:=true; 7:if a>b then f:=true; 8:if a<b then f:=true; end; if f=true then begin x:=t+1; k:=x-1; end; if f=false then begin x:=t+2; k:=x-1; end; end; procedure ras; begin k:=1; while k<>n do begin st:=a[k]; t:=k; st2:=a[k+1]; if ord(st[1])<58 then begin m:=0; case ToDec(st[1]+st[2]+st[3]+st[4],2) of
1:Input; 2:Output; 3:add; 4:sub; 5:mult; 6:divis; 7:uslov; 8:uslov; 9:uslov; 10:wentto; 11: regsum; 12: SumReg; end; end; k:=k+1; end; end; procedure registr; var i:integer; begin for i:=49 to 59 do reg[i-48].obozn:=chr(i) end; BEGIN repeat clrscr; registr; fail; ras; until finish; end.