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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> разработка виртуального процессора, помогите разработать виртуальный процессор
сообщение
Сообщение #1


Бывалый
***

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

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


помогите сделать задание smile.gif задача такая:Разработать виртуальный процессор для арифметических операций над целыми числами.
Система команд-арифметические операции над содержимым регистров ввод и вывод значений регистров,условный и безусловный переход к команде заданного номера.длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),в первых 2Х содержаться операнды, в 3й заносится результат операции. дать описание системы команд и программу для вычисления суммы квадратов первых n натуральных чисел.препод вообще ниче не обьяснил по этой теме и я блин даже не представляю как это сделать в паскале.мнеб хотяб понять как это делать smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
мнеб хотяб понять как это делать
Понять, говоришь? Ну, попробуй:
Виртуальный процессор над битовыми строками

(если тебе надо "на блюдечке" программу ИМЕННО для твоего случая - можешь туда даже не ходить, предупреждаю сразу. Я привел эту ссылку ТОЛЬКО для того, чтоб ты понял, что это за задание, и как оно может решаться.)

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

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

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


аможно в 2х словах обьяснить как в паскале вообще с регистрами работать?
rgs[i]
вот это чтоли и есть регистр?

Добавлено через 5 мин.
 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;

эта процедура для вывода значения регистра?

Сообщение отредактировано: blackhard -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

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

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


короче у меня такой вопрос:
$80000000
вот это я так понимаю адрес в памяти.а в задаче регистр в 32 бита а мне надо в 6 бит можите подсказать как это сделать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

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

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


Цитата(blackhard @ 22.11.2007 20:07) *

короче у меня такой вопрос:
$80000000
вот это я так понимаю адрес в памяти.а в задаче регистр в 32 бита а мне надо в 6 бит можите подсказать как это сделать?

поменяй на $20
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

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

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


уф я понял как написать прогу smile.gif токо я так и не понял как сделать этодлинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),щас напишу прогу как я понял и выложу ее тут.тогда посмотрите?и поможите доделать? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

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

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


Цитата(blackhard @ 22.11.2007 21:46) *

длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),[/color]

Преобразовать команды и номера регистров в 3 байта можно примерно так:
b1:=(c shl 2) or (r1 shr 4);
b2:=(r1 shl 4) or (r2 shr 2);
b3:=(r2 shl 6) or r3;
и обратно:
c:=b1 shr 2;
r1:=(b2 shr 4) or ((b1 and 3) shl 4);
r2:=((b2 shl 2)and $3f) or (b3 shr 6);
r3:=b3 and $3f;

Если не напутал нигде smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

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

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


Program processor;
Uses CRT;
type treg=record
obozn:char;
chislo:integer;
end;
var a:array[1..20] of string;
st:string;ch:char;
n,m,k:byte;
reg:array[1..26] of treg;
f:text;
procedure fail;
begin
assign(f,'algoritm.txt');
reset(f);
n:=1;
while not eof(f) do
begin
readln(f,a[n]);
n:=n+1;
end;
end;
procedure Input;
var i,j:1..26;
s:string;
k,Osh:integer;
begin
s:='';
for i:=1 to 26 do
if reg[i].obozn=st[7+m] then
if st[8+m]<>',' then
begin
writeln('Введите число в регистр ',st[7+m]);
readln(reg[i].chislo);
end
else
begin
for j:=9+m to length(st) do s:=s+st[j];
val(s,k,Osh);
reg[i].chislo:=k;
end;
end;
procedure Output;
var i:1..26;
begin
for i:=1 to 26 do
if reg[i].obozn=st[8+m] then
begin
writeln('Число в регистре ',st[8+m],' =',reg[i].chislo);
end;
end;
procedure Add;
var s:longint;
a,b:integer;
i:1..26;
begin
s:=0;a:=0;b:=0;
for i:=1 to 26 do
begin
if st[5+m]=reg[i].obozn then a:=reg[i].chislo;
if st[7+m]=reg[i].obozn then b:=reg[i].chislo;
s:=a+b;
end;
for i:=1 to 26 do
begin
if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
end;
end;

procedure Sub;
var s:longint;
a,b:integer;
i:1..26;
begin
s:=0;a:=0;b:=0;
for i:=1 to 26 do
begin
if st[5+m]=reg[i].obozn then a:=reg[i].chislo;
if st[7+m]=reg[i].obozn then b:=reg[i].chislo;
s:=a-b;
end;
for i:=1 to 26 do
begin
if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
end;
end;

procedure Mult;
var s:longint;
a,b:integer;
i:1..26;
begin
s:=0;a:=0;b:=0;
for i:=1 to 26 do
begin
if st[5+m]=reg[i].obozn then a:=reg[i].chislo;
if st[7+m]=reg[i].obozn then b:=reg[i].chislo;
s:=a*b;
end;
for i:=1 to 26 do
begin
if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
end;
end;

procedure Divis;
var s:longint;
a,b:integer;
i:1..26;
begin
s:=0;
a:=0;
b:=1;
for i:=1 to 26 do
begin
if st[5+m]=reg[i].obozn then
a:=reg[i].chislo;
if st[7+m]=reg[i].obozn then
b:=reg[i].chislo;
s:=Round(a div b);
end;
for i:=1 to 26 do
begin
if st[9+m]=reg[i].obozn then reg[i].chislo:=s;
end;
end;
procedure wentto;
var s:string;
x,osh:integer;
i:1..26;
begin
s:='';
for i:=4+m to length(st) do
s:=s+st[i];
val(s,x,osh);
k:=x-1;
end;
procedure Uslov;
var a,b:integer;
i:1..26;
f:boolean;
begin
f:=false;
for i:=1 to 26 do
begin
if st[6]=reg[i].obozn then
a:=reg[i].chislo;
if st[8]=reg[i].obozn then
b:=reg[i].chislo;
end;
case st[7] of
'=':if a=b then f:=true;
'>':if a>b then f:=true;
'<':if a<b then f:=true;
end;
if f=true then
begin
m:=9;
case st[10]of
'I':Input;
'A':Add;
'S':Sub;
'M':Mult;
'D':Divis;
'C':Uslov;
'O':Output;
'T':Wentto;
end;
end;
end;
procedure ras;
begin
k:=1;
while k<>n do
begin
st:=a[k];
if ord(st[1])<58 then
begin
m:=1;
case st[2]of
'I':Input;
'A':Add;
'S':Sub;
'M':Mult;
'D':Divis;
'C':Uslov;
'O':Output;
'T':Wentto;
end;
end;
if ord(st[1])>64 then
begin
m:=0;
case st[1]of
'I':Input;
'A':Add;
'S':Sub;
'M':Mult;
'D':Divis;
'C':Uslov;
'O':Output;
end;
end;
k:=k+1;
end;
end;
procedure registr;
var i:integer;
begin
for i:=65 to 90 do
reg[i-64].obozn:=chr(i)
end;
BEGIN
clrscr;
repeat
autor;
registr;
fail;
ras;
writeln('Продолжить? (y/n)');
ch:=readkey;
until UpCase(ch)<>'Y';
END.
ну вот чето сделал и она считает и наверно даже правильно но это неважно.что я не пойму так это как организовать команды вот так длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит) помогите доделать 15 б)
INPUT
аDD
SUB
MUL
DIV
CASE
OUTPUT вот собственно названия команд
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

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

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


ну че никто мне не поможет?помогите очень прошу smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

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

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


Цитата(blackhard @ 26.11.2007 19:00) *

ну че никто мне не поможет?помогите очень прошу smile.gif

На твой вопрос о переводе 3-х байтовой команды в 4 шести битовых значения и обратно я написал в предыдущем посте. Остальное тебе понятно..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

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

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


Цитата(Malice @ 22.11.2007 22:33) *

Преобразовать команды и номера регистров в 3 байта можно примерно так:
b1:=(c shl 2) or (r1 shr 4);
b2:=(r1 shl 4) or (r2 shr 2);
b3:=(r2 shl 6) or r3;
и обратно:
c:=b1 shr 2;
r1:=(b2 shr 4) or ((b1 and 3) shl 4);
r2:=((b2 shl 2)and $3f) or (b3 shr 6);
r3:=b3 and $3f;

Если не напутал нигде smile.gif

а можно небольшой комментарий я не знаком с операциями shl shr
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

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

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


Цитата(blackhard @ 26.11.2007 21:23) *

а можно небольшой комментарий я не знаком с операциями shl shr

Shr - битовый сдвиг вправо, аналогичен делению на 2 на каждый бит. Shl - влево - умножение на 2.
пусть у тебя 4 6-ти битовых числа, в 3-х байтах они выглядят так:
11111122 22223333 33444444
чтобы получить первый байт, нужно сдвинуть на 2 бита влево первое число (c shl 2) и сложить с 2-мя старшими от второго (r1 shr 4). Аналогично для 2-х следующих байт.
Почитай про битовые операции, это просто ;)

Сообщение отредактировано: Malice -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

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

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


а сколько бит в паскале занимает один символ например 'A'?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

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

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


1 символ занимает 1 байт, а байт это:
http://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

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

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


а как сделать чтобы все элементы reg[i].obozn массива занимали 6 бит?и можно ли после этого сравнивать
их с элементами st[m] где на символ по прежнему 8 бит?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

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

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


вобщем опять нужна помощь.доделал прогу и отправил препаду,а он написал что она должна работать с командами заданными в машинном коде
сейчас она работает вот с такими командами
IN 1
IN 2,1
IN 4,0
AD 1,2,1
IN 3,1
MUL 3,3,5
AD 4,5,4
AD 3,2,3
CASE 3<1 TO 6
OUTPUT 4
так вчем мой вопрос:
например команда in 1 в машинном коде выглядит примерно так так 010100 000001 000000 000000
если я напишу такую команду прога попросит ввести число в регистр 1 ну а если мне надо ввести уже заданное число т.е in 1 15 а по заданию у меня команда длинной 3Б номер команды 6б и номера регистров 6б и где тогда задавать число 15 ? и тоже самое с командой условия как задать <>= такие знаки ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(blackhard @ 30.11.2007 23:30) *

если я напишу такую команду прога попросит ввести число в регистр 1 ну а если мне надо ввести уже заданное число

Нет, так процессоры не работают. Они вообще ничего не запрашивают, никогда. Запрашивают программы. Процессоры только выполняют действия. Поэтому команда ввода числа в регист уже должна содержать это число. Если она его не содержит, то тогда скажи - а что вообще эта команда делает?? Конечно, бывают такие команды, которые работают за два такта:
1. in 2
2. 15
- в первом такте сообщается, что дальше будет число, которое нужно положить в регистр 2, а в следующем - само число идет.
Но только мне кажется, что это не есть твой случай. Я думаю, твой операнд идет непосредственно в команде. Примерно так:

хх000001 хх000010 хх001111

, где хх000001 - это номер команды (1), хх000010 - номер регистра (2), хх001111 - операнд (15).
Знаком х обозначены биты, которые не используются. Я не вполне понимаю, почему на номер регистра, которых всего три, нужно было отводить 6 бит.. Хватило бы и двух. Поле номера команды вряд ли тоже требует 6 бит (что означет 64 номера). А поле операнда шестибитное, потому что его длина должна быть равна длине регистра. Конечно, расположить можно было бы все и иначе, например так:

CCCCCCRRRRRRPPPPPPxxxxxx

- здесь С - поле команды, R - поле номера регистра, P - поле значения операнда (я назвал от слова Parameter, потому что первая буква слова Operand похожа на ноль). Так или иначе остаются лишние 6 бит. Но с первым вариантом (xxCCCCCCxxRRRRRRxxPPPPPP) работать явно удобнее (каждая функция в своем байте).

После выполнения этой команды в регистре 2 должно быть число 15.

Ты покажи свою прогу, текущий вариант. Тогда проще будет разговаривать.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Бывалый
***

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

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


Цитата(Lapp @ 1.12.2007 9:51) *

Нет, так процессоры не работают. Они вообще ничего не запрашивают, никогда. Запрашивают программы. Процессоры только выполняют действия. Поэтому команда ввода числа в регист уже должна содержать это число. Если она его не содержит, то тогда скажи - а что вообще эта команда делает?? Конечно, бывают такие команды, которые работают за два такта:
1. in 2
2. 15
- в первом такте сообщается, что дальше будет число, которое нужно положить в регистр 2, а в следующем - само число идет.
Но только мне кажется, что это не есть твой случай. Я думаю, твой операнд идет непосредственно в команде. Примерно так:

хх000001 хх000010 хх001111

, где хх000001 - это номер команды (1), хх000010 - номер регистра (2), хх001111 - операнд (15).
Знаком х обозначены биты, которые не используются. Я не вполне понимаю, почему на номер регистра, которых всего три, нужно было отводить 6 бит.. Хватило бы и двух. Поле номера команды вряд ли тоже требует 6 бит (что означет 64 номера). А поле операнда шестибитное, потому что его длина должна быть равна длине регистра. Конечно, расположить можно было бы все и иначе, например так:

CCCCCCRRRRRRPPPPPPxxxxxx

- здесь С - поле команды, R - поле номера регистра, P - поле значения операнда (я назвал от слова Parameter, потому что первая буква слова Operand похожа на ноль). Так или иначе остаются лишние 6 бит. Но с первым вариантом (xxCCCCCCxxRRRRRRxxPPPPPP) работать явно удобнее (каждая функция в своем байте).

После выполнения этой команды в регистре 2 должно быть число 15.

Ты покажи свою прогу, текущий вариант. Тогда проще будет разговаривать.

вот текущий вариант он не сильно отличается от предыдущего но всеже отличается впринципе переделть ее под двоичные команды несложно единственная проблема это вот такие знаким <>= в команде условия и сейчас для выполнения команд я использую case st[1]of
'I':Input; т е если в строке 1 буква I то выполняем процидуру ввод, а когда у меня двоичное число как проще
организовать распознование команды опять через case или можно как то проще?вот прикрепляю прогу
а это алгоритм
IN 1
IN 2,1
IN 4,0
AD 1,2,1
IN 3,1
MUL 3,3,5
AD 4,5,4
AD 3,2,3
CASE 3<1 TO 6
OUTPUT 4 он та и должен быть написан в машинном коде


Прикрепленные файлы
Прикрепленный файл  CPU10.PAS ( 5.79 килобайт ) Кол-во скачиваний: 238
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Бывалый
***

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

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


вот начал переделывать прогу для работы с машинным кодом сделал вначале только для 2х команд ввод и вывод
Program processor;
Uses CRT;
type treg=record
obozn:char;
chislo:integer;
end;
var a:array[1..20] of string;
st:string;ch:char;
n,m,k:byte;
reg:array[1..26] of treg;
f:text;
s:string;
procedure fail;
begin
writeln('ўл § Јаг§Ё«Ё Є®¤:');
assign(f,'2.txt');
reset(f);
n:=1;
while not eof(f) do
begin
readln(f,a[n]);
writeln(a[n]);
n:=n+1;
end;
end;
function ToDec(n:string; radix:longint):longint;
var
m, i: longint;
const
digit: string[16]='0123456789ABCDEF';
begin
m:=0;
while (n[1]='0') and (length(n) > 1) do delete(n,1,1);
for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;
ToDec:=m;
end;
procedure Input;
var i,j:1..10;
s,r,c:string;
k,Iv,n:integer;
begin
s:='';
r:='';
c:='';
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
for i:=1 to 10 do
if reg[i].obozn=r then
if st[14+m]<>' ' then
begin
writeln('ўўҐ¤ЁвҐ зЁб«® ў ॣЁбва ',r);
readln(reg[i].chislo);
end
else
begin
k:=todec(st[29+m]+st[30+m]+st[31+m]+st[32+m]+st[33+m]+st[34+m],2);
reg[i].chislo:=k;
end;
end;
procedure Output;
var i:1..10;
n:integer;
r:string;
begin
r:='';
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
for i:=1 to 10 do
if reg[i].obozn=r then
begin
writeln('зЁб«® ў ॣЁбвॠ',r,' =',reg[i].chislo);
end;
end;

procedure ras;
begin
k:=1;
while k<>n do
begin
st:=a[k];
if ord(st[1])<58 then
begin
m:=0{1};
case ToDec(st[1]+st[2]+st[3]+st[4]+st[5]+st[6],2) of
1:Input;
2:Output;
end;
end;
k:=k+1;
end;
end;
procedure registr;
var i:integer;
begin
for i:=48 to 58 do
reg[i-47].obozn:=chr(i)
end;
BEGIN
clrscr;
registr;
fail;
ras;
readln;
end.
может конечно не рационально но я другого способа не знаю.
000001 000001 000000 000000 000011
000010 000001 000000 000000
сдесь я в регистр 1 ввожу число 3 и вывожу егог на экран кстати по заданию даже если команда использует 1 регистр номера других должны быть просто нулями
так вот помогите переделать команду условия темже способом вот она
procedure Uslov;
var a,b:integer;
i:1..26;
f:boolean;
begin
f:=false;
for i:=1 to 26 do
begin
if st[6]=reg[i].obozn then
a:=reg[i].chislo;
if st[8]=reg[i].obozn then
b:=reg[i].chislo;
end;
case st[7] of
'=':if a=b then f:=true;
'>':if a>b then f:=true;
'<':if a<b then f:=true;
end;
if f=true then
begin
m:=9;
case st[10]of
'I':Input;
'A':Add;
'S':Sub;
'M':Mult;
'D':Divis;
'C':Uslov;
'O':Output;
'T':Wentto;
end;
end;
end;
а то я чето не врубаюсь че делать со знаками условия
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






У тебя на код команды отводится 6 бит, а команд на самом деле меньше. Надо на каждый вид условия (если равно то, если > то, если меньше то, и т.д.) выделить отдельный код команды. Тогда в 1 и 2 операндах будут регистры, а в 3-ем адрес перехода при верном условии.
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 28.03.2024 23:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name