Помощь - Поиск - Пользователи - Календарь
Полная версия: Виртуальный процессор над битовыми строками
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
NoRToN
Разработать виртуальный процессор для логических операций над битовыми строками.
Система команд – логические операции над содержимым 32-разрядных регистров , ввод и вывод содержимого регистров в шестнадцатеричной форме , считывание содержимого регистра в выделенный регистр (сумматор) и запись в регистр содержимого сумматора. Команды записываются в мнемонической форме с указанием имени регистра , в котором содержится один из операндов , второй операнд берётся из сумматора. Результат операции записывается в сумматор.
Дать описание системы команд и программу для вычисления значений булевской функции.
ПОМОГИТЕ. Заранее спасибо
Altair
То есть вы просите написать всю систему??
Если есть конекретные вопросы, тогда другое дело ...

1. требуется определить чем будем эмулировать регистры (не забываем что 32 разрядние - то есть 4 байта... можно использовать как регистр число типа LONGINT)...
2. ввод чисел в шестнадцатиричное СС - в FAQ'е есть процедура для конвертирования.
То есть вводим в 16. а работаем в 10.
NoRToN
Просто я не представляю ,что эта программа должна делать. Пример хотя бы.

Добавлено позже:
Я могу решать только простые задачи. А это задача не по мне... Помогите мне с решением !mol1.gif
Altair
Цитата
Просто я не представляю ,что эта программа должна делать. Пример хотя бы.

Она должна эмулировать работу процессора.
напрмер ввожу я 2 чсила. И она показывает в какие регистры что помещает, и как вычисляет пошагово - все это должно быть визуализированно.
volvo
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
А как здесь сделать, чтобы ввод и вывод осуществлялся в 16-ой форме.(в вирт процессе)

А тут, чтобы коэффициенты матрицы вводились с клавиатуры
censored
volvo
NoRToN
Цитата
А как здесь сделать, чтобы ввод и вывод осуществлялся в 16-ой форме.(в вирт процессе)

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

А вот второй вопрос к этой теме не относится... Спрашивай там, где программа была написана...
NoRToN
хорошо. Просто по заданию надо в 16 форме , а у мен яне получилось переделать
lidok
как сделать с сумматором я знаю, а как с 3 регистрами - нет. И что такое условный, безусловный переходы и мнемоническая форма??
volvo
lidok
Если человек знает, как сделать с сумматором, то для 3-х регистров переделать - для него не проблема ... Тем более, что сумматор ведь тоже регистр ...
lidok
И как это сделать?? Ты знаешь??
1nvaL
Спасибо за этот пример! Вобщем мне сказали вот что:
текст программы в машинных кодах должен считываться из отдельного текстового файла.
Ты не мог бы помоч мне это сделать???
Гость
Приведите пример программы к етому процессору =)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.