Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2007, 21:41   #1
darkstoun
 
Регистрация: 22.11.2007
Сообщений: 4
По умолчанию виртуальный процессор

помогите пожалуйста доделать программу задание такое:разработать виртуальный процессор для арифметических операций над целыми числами.
Система команд-арифметические операции над содержимым регистров ввод и вывод значений регистров,условный и безусловный переход к команде заданного номера.длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),в первых 2Х содержаться операнды, в 3й заносится результат операции. дать описание системы команд и программу для вычисления суммы квадратов первых n натуральных чисел.впринципе я написал прогу и она даже работает но вот что я непонял так это как сделать вот это :длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),в первых 2Х вот сама прога
Код:
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 fail;
begin
  assign(f,'algoritm.txt');
  reset(f);
  n:=1;
  while not eof(f) do
   begin
    readln(f,a[n]);
    n:=n+1;
   end;
end;

procedure Input;
var i,j:1..26;
    s:string;
    k,Osh:integer;
begin
  s:='';
  for i:=1 to 26 do
   if reg[i].obozn=st[7+m] then
     if st[8+m]<>',' then
      begin
       writeln('Введите число в регистр ',st[7+m]);
       readln(reg[i].chislo);
      end
       else
        begin
         for j:=9+m to length(st) do s:=s+st[j];
         val(s,k,Osh);
         reg[i].chislo:=k;
        end;
end;

procedure Output;
var i:1..26;
begin
  for i:=1 to 26 do
   if reg[i].obozn=st[8+m] then
    begin
     writeln('Число в регистре ',st[8+m],' =',reg[i].chislo);
    end;
end;


procedure Add;
var s:longint;
    a,b:integer;
    i:1..26;
begin
  s:=0;a:=0;b:=0;
  for i:=1 to 26 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 26 do
   begin
    if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
   end;
end;

procedure Sub;
var s:longint;
    a,b:integer;
    i:1..26;
begin
  s:=0;a:=0;b:=0;
  for i:=1 to 26 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 26 do
   begin
    if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
   end;
end;

procedure Mult;
var s:longint;
    a,b:integer;
    i:1..26;
begin
  s:=0;a:=0;b:=0;
  for i:=1 to 26 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 26 do
   begin
    if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
   end;
end;

procedure Divis;
var s:longint;
    a,b:integer;
    i:1..26;
begin
  s:=0;
  a:=0;
  b:=1;
  for i:=1 to 26 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 26 do
   begin
    if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
   end;
end;
procedure wentto;
var s:string;
    x,osh:integer;
    i:1..26;
begin
  s:='';
  for i:=4+m to length(st) do
  s:=s+st[i];
  val(s,x,osh);
  k:=x-1;
end;
procedure Uslov;
var a,b:integer;
    i:1..26;
    f:boolean;
begin
  f:=false;
  for i:=1 to 26 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 a<b then f:=true;
   end;
  if f=true then
   begin
    m:=9;

    case st[10]of
      'I':Input;
      'A':Add;
      'S':Sub;
      'M':Mult;
      'D':Divis;
      'C':Uslov;
      'O':Output;
      'T':Wentto;
     end;

   end;
end;

procedure ras;
begin
  k:=1;
  while k<>n 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:=65 to 90 do
   reg[i-64].obozn:=chr(i)
end;
BEGIN
clrscr;
repeat
autor;
registr;
fail;
ras;
writeln('Продолжить? (y/n)');
    ch:=readkey;
until UpCase(ch)<>'Y';
END.
помогите доделать заранее спасибо
darkstoun вне форума Ответить с цитированием
Старый 22.11.2007, 21:41   #2
darkstoun
 
Регистрация: 22.11.2007
Сообщений: 4
По умолчанию

вот собственно список команд
INPUT A ввод значения регистра A
(Ввод может осуществляться следующим образом: а)INPUT A,15 – В регистр A будет введена цифра 15 б)INPUT A – Программа потребует ввести число с клавиатуры)
АDD A,B,C - сумма значения регистра A и значения регистра B. В регистр С записывается результат.
SUB A,B,C - разность значения регистра А и значения регистра B. В регистр С записывается результат.
MUL A,B,C - произведение значения регистра А и значения регистра B. В регистр С записывается результат.
DIV A,B,C - деление значения регистра A на значение регистра B. В регистр С записывается результат.
CASE D>E - оператор условия.
Система работы - например: CASE D=B ADD A,B,C - если значение регистра D равняется значению регистра B, то регистр A складывается с регистром B и результат записывается в регистр C
CASE C<N TO 6 - если значение регистра С меньше значения регистра N то осуществляется переход на 6 строку файла
(Значения условий: <, >, =)
TO 5 переход на 5 строку файла
OUTPUT A вывод значения регистра A
darkstoun вне форума Ответить с цитированием
Старый 23.11.2007, 10:24   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Это то же задание? http://programmersforum.ru/showthread.php?t=9426
Дома сейчас от нефиг-делать пишу, но на делфи, такой-себе виртуализатор кода
пыщь
JTG вне форума Ответить с цитированием
Старый 23.11.2007, 21:12   #4
darkstoun
 
Регистрация: 22.11.2007
Сообщений: 4
По умолчанию

задание почти такое но мне надо организовать команды вот таким образом длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит) и чето я никак не пойму как это сделать
darkstoun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает процессор? Иллидан Компьютерное железо 13 17.07.2011 14:04
Процессор subsonic Общие вопросы Delphi 10 19.06.2008 11:37
Зачем принтеру процессор? Иллидан Компьютерное железо 6 21.05.2008 20:11
Виртуальный функции. Иллидан Помощь студентам 3 11.04.2008 10:28
']'-виртуальный код Var17 Общие вопросы Delphi 2 02.04.2008 14:11