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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2013, 12:54   #1
VasyaSam
Пользователь
 
Аватар для VasyaSam
 
Регистрация: 07.12.2013
Сообщений: 13
Сообщение Написать эмулятор вычислительной машины в классической архитектуре фон Неймана, которая реализует небольшой набор команд.

Написать эмулятор вычислительной машины в классической архитектуре фон Неймана, которая реализует небольшой набор команд.
Список команд для реализации:
- присваивание (MOV 01010 10010101 - присвоить ячейке памяти по адресу, указанному в левом операнде, двоичное значение правого операнда)
- сложение (ADD 00010 00110 01010 - сложить операнды по адресам, указанным в первых двух операндах, результат записать по адресу третьего операнда)
- умножение (MUL 00101 10010 10111 - умножить операнды по адресам, указанным в первых двух операндах, результат записать по адресу третьего операнда)
- деление (DIV 01001 11001 10101 - разделить операнд по левому адресу на операнд по правому адресу, результат записать по адресу третьего операнда)
- сравнение (CMP 01101 10101 11110 - сравнить операнд по левому адресу с операндом по правому адресу. Если левый операнд больше, записать по адресу третьего операнда 1, если меньше – 2, если равен – 3)
- условный переход (JMP 10101 01011 01010 если значение операнда по первому адресу равно 0, перейти на строку программы, номер которой указан по адресу во втором операнде, иначе перейти по адресу, указанному в третьем операнде)
- вывод (PRT 01011 - вывести на экран содержимое ячейки с указанным адресом)

Команды подаются в двоичном коде следующим образом
ХХХ AAAAA BBBBB CCCCC
где ХХХ - код команды, AAAAA - адрес первого операнда для команды, BBBBB - адрес второго операнда для команды, ССССС - результат выполнения команды

ЭВМ оснащена 64 ячейками памяти данных, из которых 32 ячейки отданы под память данных, 32 - под память для программы. Размер ячейки 8 бит.

ПРИМЕР ПРОГРАММЫ.
Необходимо вычислить площадь круга. Радиус принять равным 4, число ПИ равным 3.
1 MOV 00001 00000011 записать в первую ячейку памяти число 3
2 MOV 00002 00000100 записать во вторую ячейку памяти число 4
3 MUL 00002 00002 00003 умножить число во второй ячейке само на себя, результат поместить в третью ячейку памяти
4 MUL 00001 00003 00004 умножить число в первой ячейке на число в третьей, результат поместить в четвертую ячейку памяти
5 PRT 00004 вывести значение четвертой ячейки памяти на экран
VasyaSam вне форума Ответить с цитированием
Старый 07.12.2013, 13:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public     a:array[1..4] of integer;
    st:TStringList;
    procedure cmd(s:string);
    function btoi(s:string):Integer;
  end;

{ TMyApplication }



procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
begin
  st:=TStringList.Create;
  { add your program here }
  cmd('MOV 00001 00000011');
  cmd('MOV 00002 00000100');
  cmd('MUL 00002 00002 00003');
  cmd('MUL 00001 00003 00004');
  cmd('PRT 00004');
  // stop program loop
  st.Free;
  write('end');readln;
  Terminate;
end;

procedure TMyApplication.cmd(s: string);
var i:integer;
begin
 st.DelimitedText:=AnsiLowerCase(s);
 i:=btoi(st[1]);
 //if i=0 then exit;
 if st[0]='mov' then a[i]:=btoi(st[2]) else
   if st[0]='mul' then a[btoi(st[3])]:=a[btoi(st[1])]*a[btoi(st[2])] else
     if st[0]='prt' then write(a[i]) else
       ;
end;

function TMyApplication.btoi(s: string): Integer;
var i:integer;
begin
 Result:=0;
 for i:=1 to Length(s) do begin
   if s[i]='1' then   Result:=Result+1
   else Result:=Result+0;
   Result:=Result shl 1;
 end;
end;

var
  Application: TMyApplication;
begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.12.2013, 18:49   #3
VasyaSam
Пользователь
 
Аватар для VasyaSam
 
Регистрация: 07.12.2013
Сообщений: 13
По умолчанию

большое спасиБо))) очень признателен!!!
VasyaSam вне форума Ответить с цитированием
Старый 08.12.2013, 19:19   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пожалуйста )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2013, 20:53   #5
VasyaSam
Пользователь
 
Аватар для VasyaSam
 
Регистрация: 07.12.2013
Сообщений: 13
По умолчанию

Виталий, подскажите пожалуйста, я не могу разобраться как работает программа, вставляю код в лазарус запускаю ее и на экран выводит 384end и все, а дальше как быть, скажите пожалуйста)
VasyaSam вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация стека. Написать программу на языке C + + которая реализует стек. Кулибаба Петро C++ Builder 0 16.01.2013 22:47
Архитектура фон Неймана, самопрограммирование и отладчик Levsha100 Свободное общение 4 19.08.2010 22:12