Помощь - Поиск - Пользователи - Календарь
Полная версия: Виртуальный процессор
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Mixa-
Мне нужен был виртуальный процессор, ниже список команд есть. Надо чтобы команда была 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 Переносим из регистра в сумматор


Вот сам код:
0001 0101
1100 1111
0100 1111
1100 0011
1011 1111
1100 1111
0101 1111
1100 0001
0011 0011
1100 0011
1011 1111
0100 0011
1100 0001
1011 1111
0110 0011
0111 0011
1010 0110
0010 0001


Вот вопрос: где тут может быть ошибка... так как после того как вводиться число в программе, она выключается... завершается вообщем и ответ не выводит.



Вот код процессора:

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('ўл § Јаг§Ё«Ё Є(r)¤:');
 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('ўўҐ¤ЁвҐ зЁб«(r) ў б㬬 в(r)а')
    else
    writeln('ўўҐ¤ЁвҐ зЁб«(r) ў ॣЁбва ',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('зЁб«(r) ў б㬬 в(r)ॠ= ',reg[i].chislo)
    else
   writeln('зЁб«(r) ў ॣЁбвॠ',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.


Гость
Или можете хотя бы на ассемблере написать программу к моему процессору
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.