Автор: NoRToN 16.12.2004 2:37
Разработать виртуальный процессор для логических операций над битовыми строками.
Система команд – логические операции над содержимым 32-разрядных регистров , ввод и вывод содержимого регистров в шестнадцатеричной форме , считывание содержимого регистра в выделенный регистр (сумматор) и запись в регистр содержимого сумматора. Команды записываются в мнемонической форме с указанием имени регистра , в котором содержится один из операндов , второй операнд берётся из сумматора. Результат операции записывается в сумматор.
Дать описание системы команд и программу для вычисления значений булевской функции.
ПОМОГИТЕ. Заранее спасибо
Автор: Altair 16.12.2004 16:53
То есть вы просите написать всю систему??
Если есть конекретные вопросы, тогда другое дело ...
1. требуется определить чем будем эмулировать регистры (не забываем что 32 разрядние - то есть 4 байта... можно использовать как регистр число типа LONGINT)...
2. ввод чисел в шестнадцатиричное СС - в FAQ'е есть процедура для конвертирования.
То есть вводим в 16. а работаем в 10.
Автор: NoRToN 17.12.2004 1:59
Просто я не представляю ,что эта программа должна делать. Пример хотя бы.
Добавлено позже:
Я могу решать только простые задачи. А это задача не по мне... Помогите мне с решением
Автор: Altair 17.12.2004 21:49
Цитата
Просто я не представляю ,что эта программа должна делать. Пример хотя бы.
Она должна эмулировать работу процессора.
напрмер ввожу я 2 чсила. И она показывает в какие регистры что помещает, и как вычисляет пошагово - все это должно быть визуализированно.
Автор: volvo 18.12.2004 9:43
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 25.12.2004 0:43
А как здесь сделать, чтобы ввод и вывод осуществлялся в 16-ой форме.(в вирт процессе)
А тут, чтобы коэффициенты матрицы вводились с клавиатуры
censored
Автор: volvo 25.12.2004 0:58
NoRToN
Цитата
А как здесь сделать, чтобы ввод и вывод осуществлялся в 16-ой форме.(в вирт процессе)
Ввод осуществляется в строку, найди, где она преобразуется в число и делай, что тебе надо... Только зачем? Ты что, сможешь контролировать результат в 16-ой системе?
А вот второй вопрос к этой теме не относится... Спрашивай там, где программа была написана...
Автор: NoRToN 25.12.2004 6:49
хорошо. Просто по заданию надо в 16 форме , а у мен яне получилось переделать
Автор: lidok 26.12.2004 5:36
как сделать с сумматором я знаю, а как с 3 регистрами - нет. И что такое условный, безусловный переходы и мнемоническая форма??
Автор: volvo 26.12.2004 5:39
lidok
Если человек знает, как сделать с сумматором, то для 3-х регистров переделать - для него не проблема ... Тем более, что сумматор ведь тоже регистр ...
Автор: lidok 26.12.2004 5:44
И как это сделать?? Ты знаешь??
Автор: 1nvaL 15.12.2005 22:58
Спасибо за этот пример! Вобщем мне сказали вот что:
текст программы в машинных кодах должен считываться из отдельного текстового файла.
Ты не мог бы помоч мне это сделать???
Автор: Гость 10.12.2006 18:32
Приведите пример программы к етому процессору =)