IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Виртуальный процессор над битовыми строками
NoRToN
сообщение 15.12.2004 22:37
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Разработать виртуальный процессор для логических операций над битовыми строками.
Система команд – логические операции над содержимым 32-разрядных регистров , ввод и вывод содержимого регистров в шестнадцатеричной форме , считывание содержимого регистра в выделенный регистр (сумматор) и запись в регистр содержимого сумматора. Команды записываются в мнемонической форме с указанием имени регистра , в котором содержится один из операндов , второй операнд берётся из сумматора. Результат операции записывается в сумматор.
Дать описание системы команд и программу для вычисления значений булевской функции.
ПОМОГИТЕ. Заранее спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.12.2004 5:43
Сообщение #2


Гость






NoRToN
Значит, так: вот набросок виртуального процессора. Это чтобы было понятно, чего от тебя хотят, и как вообще это делать...

Система команд:
Цитата
in    <#> <значение> - заслать <значение> в регистр <#>
out <#> - показ значения регистра <регистр#>
mov <#> - переслать содержимое регистра <#> в сумматор
reg  <#> - переслать содержимое сумматора в регистр <#>
and  <#> - операция AND между значениями сумматора и регистра <#> Результат - в сумматоре
or    <#> - операция OR между значениями сумматора и регистра <#> Результат - в сумматоре
xor  <#> - операция XOR между значениями сумматора и регистра <#> Результат - в сумматоре
halt - останов процессора (выход из программы)


"Процессор" расчитан на 10 регистров...
Вот сама программа. Если есть баги - сильно не ругаться, посмотри на время поста... ;)
Код
uses crt;

const
 n = 10;
 alu = succ(n);
 rgs: array[1 .. n+1] of longint = {начальные значения - для отладки...}
   (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0);

type
 TWords =
   (rwError,
    rwIn, rwOut, rwMov, rwReg, rwAnd, rwOr, rwXor, rwHalt);

const
 words: array[TWords] of string =
   ('', 'in', 'out', 'mov', 'reg', 'and', 'or', 'xor', 'halt');
 letter: array[boolean] of char =
   ('0', '1');
procedure print_reg(i: integer);
 var x: longint;
 begin
   x := rgs[i];
   for i := 0 to 31 do
     write( letter[((x shl i) and $80000000) = $80000000] );
 end;

procedure show_cpu;
 var i: integer;
 begin
   for i := 1 to n do
     begin
       gotoxy(1, i); write('reg(', i, '):');
       gotoxy(20, i); print_reg(i)
     end;

   gotoxy(1, n+3); write('sum: ');
   gotoxy(20, n+3); print_reg(n+1);
 end;

function get_command: boolean;
 procedure print_error;
   begin
     gotoxy(1, n+5); write('>> ILLEGAL INSTRUCTION <Enter>');
     readln
   end;

 function find_word(s: string): TWords;
   var i: TWords;
   begin
     for i := succ(low(TWords)) to high(TWords) do
       if s = words[i] then
         begin
           find_word := i; exit
         end;
     find_word := rwError
   end;

 function next_token(s: string; var x: longint;
          max: longint): boolean;
   var err: integer;
   begin
     next_token := false;
     if s = '' then exit;

     while s[1] = ' ' do
       delete(s, 1, 1);
     val(s, x, err);
     next_token :=
       ((err <> 0) or (x <= 0) or (x > max))
   end;

 var
   s, s_oper: string;
   p: byte;
   found: TWords;
   value, data: longint;
 begin
   gotoxy(1, n+5); write('':55);
   gotoxy(1, n+5); write('>');
   readln(s);

   p := pos(' ', s);
   if p > 0 then
     begin
       s_oper := copy(s, 1, pred(p));
       delete(s, 1, p)
     end
   else s_oper := s;

   get_command := false;
   found := find_word(s_oper);
   case found of
     rwOut .. rwXor:
       begin
         if next_token({copy(s, 1, pred(pos(' ', s)))}s, value, n)
           then print_error {error occured}
           else
             begin
               case found of
                 rwOut:
                   begin
                     gotoxy(1, n+5); write('>> reg(', value, ') = ', rgs[value], ' <Enter>');
                     readln
                   end;
                 rwMov: rgs[alu] := rgs[value];
                 rwReg: rgs[value] := rgs[alu];
                 rwAnd: rgs[alu] := rgs[alu] and rgs[value];
                 rwOr: rgs[alu] := rgs[alu] or rgs[value];
                 rwXor: rgs[alu] := rgs[alu] xor rgs[value];
               end;
               get_command := false;
               exit
             end;
       end;
     rwIn:
       begin
         if next_token(copy(s, 1, pred(pos(' ', s))), value, n)
           then print_error {error occured}
           else
             begin
               delete(s, 1, pos(' ', s));
               if next_token(s, data, maxlongint)
                 then print_error {error occured}
                 else
                   begin
                     rgs[value] := data;
                     get_command := false;
                     exit
                   end;
             end;
       end;
     rwHalt:
       get_command := true;
   else
     print_error {error occured}
   end;
 end;

var
 stopped: boolean;

begin
 clrscr;
 stopped := false;
 repeat
   show_cpu;
   stopped := get_command;
 until stopped;

end.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
NoRToN   Виртуальный процессор над битовыми строками   15.12.2004 22:37
Altair   То есть вы просите написать всю систему?? Если ест...   16.12.2004 12:53
NoRToN   Просто я не представляю ,что эта программа должна ...   16.12.2004 21:59
Altair   Она должна эмулировать работу процессора. напрмер...   17.12.2004 17:49
volvo   NoRToN Значит, так: вот набросок виртуального про...   18.12.2004 5:43
NoRToN   А как здесь сделать, чтобы ввод и вывод осуществля...   24.12.2004 20:43
volvo   NoRToN Ввод осуществляется в строку, найди, где ...   24.12.2004 20:58
NoRToN   хорошо. Просто по заданию надо в 16 форме , а у ме...   25.12.2004 2:49
lidok   как сделать с сумматором я знаю, а как с 3 регистр...   26.12.2004 1:36
volvo   lidok Если человек знает, как сделать с сумматоро...   26.12.2004 1:39
lidok   И как это сделать?? Ты знаешь??   26.12.2004 1:44
1nvaL   Спасибо за этот пример! Вобщем мне сказали вот...   15.12.2005 18:58
Гость   Приведите пример программы к етому процессору =)   10.12.2006 14:32


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 14:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"