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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 20:16   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Реализация виртуальной машины

Добрый вечер: необходимо реализовать виртуальную машину для придуманного ассемблера. Реализую часть транслятора. После работы основной части транслятора у меня выдается промежуточное представление программы его необходимо выполнить. Т.е. исходный файл этой программы содержит пром представление. Можно сказать сердце вм я написала, вот часть:
Код:
program virtual_machine;

{$APPTYPE CONSOLE}

uses
  SysUtils;
//==============================================================================
//    описание типов данных и переменных
//==============================================================================
const
  memory_size=9000;
  cmd_stop=-1;
  cmd_add=-2;
  cmd_sub=-3;
  cmd_mul=-4;
  cmd_del=-5;
  cmd_neg=-6;
  cmd_load=-7;
  cmd_save=-8;
  cmd_dub=-9;
  cmd_clr=-10;
  cmd_swap=-11;
  cmd_up=-12;
  cmd_goto=-13;
  cmd_ifeq=-14;
  cmd_ifne=-15;
  cmd_le=-16;
  cmd_lt=-17;
  cmd_ge=-18;
  cmd_gt=-19;
  cmd_in=-21;
  cmd_out=-22;
  cmd_or=-23;
  cmd_and=-24;
  cmd_not=-25;

var
  memory:array[0..memory_size-1] of integer;  //память
  pc:integer; //указатель на команду
  sp:integer; //указатель на вершину стек
  cmd:integer;  //команда
  buf:integer;  //для организации свопв


//==============================================================================
//    главная программа
//==============================================================================
begin
//==============================================================================
//    инициализируем данные
//==============================================================================
  pc:=0;
  sp:=memory_size;
  cmd:=memory[pc];
//==============================================================================
//    основная работа
//==============================================================================
  while (cmd<>cmd_stop) do
  begin
    inc(pc);
    if cmd>=0 then  //если не команда записываем в стек
    begin
      dec(sp);
      memory[sp]:=cmd;
    end
    else
      case cmd of
        cmd_add:
          begin
            inc(sp);
            memory[sp]:=memory[sp]+memory[sp-1];
          end;
          cmd_sub:
          begin
            inc(sp);
            memory[sp]:=memory[sp]-memory[sp-1];
          end;
          cmd_del:
          begin
            inc(sp);
            memory[sp]:=memory[sp]/memory[sp-1];
          end;
          cmd_mul:
          begin
            inc(sp);
            memory[sp]:=memory[sp]*memory[sp-1];
          end;
          cmd_neg:
          begin
            inc(sp);
            memory[sp]:=-memory[sp];
          end;
      end;

  end;
  

end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 09.12.2010, 20:17   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

у меня возник вопрос, так как пром. представление в файле input, как считать содержимое этого файла в память? Ведь перед выполнением того что я написала, нужно чтобы в памяти были команды и аргументы
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 09.12.2010, 20:26   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может написать функцию типа readInteger?
тогда не придется все грузить в память.

или не катит?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.12.2010, 21:08   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
program virtual_machine;

{$APPTYPE CONSOLE}

uses
  SysUtils;
//==============================================================================
//    описание типов данных и переменных
//==============================================================================


var
  memory:array[0..memory_size-1] of integer;  //память
  pc:integer; //указатель на команду
  sp:integer; //указатель на вершину стек
  cmd:integer;  //команда
  buf:integer;  //для организации свопв
  in_file:text;
  ch:char;

procedure next_ch();  //получение следующего символа
begin
  if (eof(in_file)) then ch:=chr(0)  //если конец файла записываем конец файла
  else if (eoln(in_file)) then //если конец строки переходи на новую
  begin
    readln(in_file);
    ch:=chr(10);
  end
  else  //считываем из файла символ
  begin
    read(chr(10),ch);
  end;
end;


function number():integer; //определение числа:получившееся число
var
  chislo:integer;
begin
  chislo:=ord(ch)-48;
  next_ch();
  while (ch in ['0'..'9']) do
  begin
      chislo:=chislo*10+(ord(ch)-48);
      next_ch();
  end;
  number:=chislo;
end;

//==============================================================================
//    главная программа
//==============================================================================
begin
//==============================================================================
//    инициализируем данные
//==============================================================================
  pc:=0;
  sp:=memory_size;
  cmd:=memory[pc];
  assign(in_file,'input.txt');
  reset(in_file);
//==============================================================================
//    заносим данные в память
//==============================================================================
  next_ch();
  while (ch<>chr(0)) do
  begin
    while(ch<>chr(10)) do
    begin
      if (ch in ['1'..'9']) then memory[sp-1]:=number();
      
    end;
  end;
  

//==============================================================================
//    основная работа
//==============================================================================
  while (cmd<>cmd_stop) do
  begin
    inc(pc);
    if cmd>=0 then  //если не команда записываем в стек
    begin
      dec(sp);
      memory[sp]:=cmd;
    end
    else
      case cmd of
          cmd_add:
          begin
            inc(sp);
            memory[sp]:=memory[sp]+memory[sp-1];
          end;
          cmd_sub:
          begin
            inc(sp);
            memory[sp]:=memory[sp]-memory[sp-1];
          end;
          cmd_del:
          begin
            inc(sp);
            memory[sp]:=memory[sp]/memory[sp-1];
          end;
          cmd_mul:
          begin
            inc(sp);
            memory[sp]:=memory[sp]*memory[sp-1];
          end;
          cmd_neg:
          begin
            memory[sp]:=-memory[sp];
          end;
          cmd_save:
          begin
            memory[memory[sp+1]]:=memory[sp];
            sp:=sp+2;
          end;
          cmd_dub:
          begin
            sp:=sp-1;
            memory[sp]:=memory[sp+1];
          end;
          cmd_clr:
          begin
            sp:=sp+1;
          end;
          cmd_swap:
          begin
            buf:=memory[sp];
            memory[sp]:=memory[sp+1];
            memory[sp+1]:=buf;
          end;
          cmd_up:
          begin
            sp:=dec(sp);
            memory[sp]:=memory[sp+2];
          end;
          cmd_goto:
          begin
            pc:=memory[sp];
            sp:=sp+1;
          end;
          cmd_ifeq:
          begin
            if(memory[sp+2]=memory[sp+1]) then pc:=memory[sp];
            sp:=sp+3;
          end;
          cmd_ifne:
          begin
            if(memory[sp+2]<>memory[sp+1]) then pc:=memory[sp];
            sp:=sp+3;
          end;
          cmd_le:
          begin
            if(memory[sp+2]<=memory[sp+1]) then pc:=memory[sp];
            sp:=sp+3;
          end;
          cmd_lt:
          begin
            if(memory[sp+2]<memory[sp+1]) then pc:=memory[sp];
            sp:=sp+3;
          end;
          cmd_ge:
          begin
            if(memory[sp+2]>=memory[sp+1]) then pc:=memory[sp];
            sp:=sp+3;
          end;
          cmd_gt:
          begin
            if(memory[sp+2]>memory[sp+1]) then pc:=memory[sp];
            sp:=sp+3;
          end;
          cmd_in:
          begin
            sp:=sp-1;
            write('?');
            readln(memory[sp]);
          end;
          cmd_out:
          begin
            write(memory[sp+1]:memory[sp]);
            sp:=sp+2;
          end;
          else
          begin
            writeln('недопустимый код операции');
            memory[pc]:=cmd_stop;
          end;
      end;
      cmd:=memory[pc];
  end;
  readln();

end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 09.12.2010, 21:08   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот как-то так
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IP-адрес виртуальной машины в VMWare Ivan_32 Операционные системы общие вопросы 10 18.03.2013 19:04
Минимальная нагрузка от виртуальной машины bookkc Помощь студентам 2 24.08.2010 18:16
ip моддема, ip машины -=kip=- Работа с сетью в Delphi 5 28.05.2010 09:14
Автозапуск виртуальной машины VMware yarilo Софт 0 10.02.2010 17:47
Виртуальные машины! Marsik Софт 17 23.04.2008 20:33