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

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

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

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


Бывалый
***

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

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


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


Бывалый
***

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

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


опять проблема и опять с условием: если на ассемблере у меня условие выглядело так
case 1=2 add 1 2 3 если число в регистре 1 = число в регистре 2 то складываем их и помещаем в регистр 3
в машинных кодах это будет выглядеть както длинно и не по заданию поэтому я хочу сделать так
case 1=2 001001 000001 000010 000000
add 1 2 3 в машинных кодах примерно так 000011 000001 000010 000100 но вот какая проблема у меня возникла получается что add 1 2 3 выполняется 2 раза если 1=2 и выполняется даже если они не равны подскажите как этого можно избежать я выделю строки которые отвечают за это
Program processor;
Uses CRT;
type treg=record
obozn:char;
chislo:integer;
end;
var a:array[1..20] of string;
st,st2: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[29+m]<>'0') and (st[29+m]<>'1') 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 Add;
var s:longint;
a,b:integer;
c,d,r:string;
i:1..10;
begin
s:=0;a:=0;b:=0;
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
str(todec(st[15+m]+st[16+m]+st[17+m]+st[18+m]+st[19+m]+st[20+m],2),c);
str(todec(st[22+m]+st[23+m]+st[24+m]+st[25+m]+st[26+m]+st[27+m],2),d);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if c=reg[i].obozn then b:=reg[i].chislo;
s:=a+b;
end;
for i:=1 to 10 do
begin
if d=reg[i].obozn then reg[i].chislo:=s;
end;
end;
procedure Sub;
var s:longint;
a,b:integer;
i:1..10;
c,d,r:string;
begin
s:=0;a:=0;b:=0;
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
str(todec(st[15+m]+st[16+m]+st[17+m]+st[18+m]+st[19+m]+st[20+m],2),c);
str(todec(st[22+m]+st[23+m]+st[24+m]+st[25+m]+st[26+m]+st[27+m],2),d);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if c=reg[i].obozn then b:=reg[i].chislo;
s:=a-b;
end;
for i:=1 to 10 do
begin
if d=reg[i].obozn then reg[i].chislo:=s;
end;
end;
procedure Mult;
var s:longint;
a,b:integer;
i:1..10;
c,d,r:string;
begin
s:=0;a:=0;b:=0;
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
str(todec(st[15+m]+st[16+m]+st[17+m]+st[18+m]+st[19+m]+st[20+m],2),c);
str(todec(st[22+m]+st[23+m]+st[24+m]+st[25+m]+st[26+m]+st[27+m],2),d);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if c=reg[i].obozn then b:=reg[i].chislo;
s:=a*b;
end;
for i:=1 to 10 do
begin
if d=reg[i].obozn then reg[i].chislo:=s;
end;
end;
procedure Divis;
var s:longint;
a,b:integer;
i:1..10;
c,d,r:string;
begin
s:=0;a:=0;b:=0;
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
str(todec(st[15+m]+st[16+m]+st[17+m]+st[18+m]+st[19+m]+st[20+m],2),c);
str(todec(st[22+m]+st[23+m]+st[24+m]+st[25+m]+st[26+m]+st[27+m],2),d);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if c=reg[i].obozn then b:=reg[i].chislo;
s:=Round(a div b);
end;
for i:=1 to 10 do
begin
if d=reg[i].obozn then reg[i].chislo:=s;
end;
end;
procedure Uslov;
var a,b:integer;
i:1..10;
f:boolean;
r,c,d:string;
begin
writeln(st2);
writeln(ToDec(st2[1]+st2[2]+st2[3]+st2[4]+st2[5]+st2[6],2));
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
str(todec(st[15+m]+st[16+m]+st[17+m]+st[18+m]+st[19+m]+st[20+m],2),c);
str(todec(st[22+m]+st[23+m]+st[24+m]+st[25+m]+st[26+m]+st[27+m],2),d);
f:=false;
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if c=reg[i].obozn then b:=reg[i].chislo;
end;
case ToDec(st[1]+st[2]+st[3]+st[4]+st[5]+st[6],2) of
9:if a=b then f:=true;
7:if a>b then f:=true;
8:if a<b then f:=true;
end;
writeln(s);
if f=true then
begin
{m:=0;}
case ToDec(st2[1]+st2[2]+st2[3]+st2[4]+st2[5]+st2[6],2) of
1:Input;
2:Output;
3:add;
4:sub;
5:mult;
6:divis;
7:uslov;
8:uslov;
9:uslov;
end;

end;
end;
procedure ras;
begin
k:=1;
while k<>n do
begin
st:=a[k];
st2:=a[k+1];
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;
3:add;
4:sub;
5:mult;
6:divis;
7:uslov;
8:uslov;
9:uslov;
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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

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

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


У тебя при выполнении условия должен выполнятся переход к команде с номером обозначенном в 3-ем регистре.. Т.е должна измениться пременнная k в процедуре ras. И еще я не понял - у тебя же по условию 3 байта на команду, а ты работаешь со строками. Это для отладки, а потом переделаешь ? Мне кажется проще делать сразу правильно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

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

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


Цитата(Malice @ 1.12.2007 21:51) *

У тебя при выполнении условия должен выполнятся переход к команде с номером обозначенном в 3-ем регистре.. Т.е должна измениться пременнная k в процедуре ras. И еще я не понял - у тебя же по условию 3 байта на команду, а ты работаешь со строками. Это для отладки, а потом переделаешь ? Мне кажется проще делать сразу правильно.

да по поводу строк я ж преподу отправлял программу которая работала с ассемблерными командами и там работа была тоже со строками он мне написал что прога работает правильно токо нужно переделать с ассемблерных команд на машинный код так что я думаю так тоже правильно.
но если в 3ем регистре будет хранится номер команды то где хранить параметры этой команды?

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


Профи
****

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

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


Цитата(blackhard @ 1.12.2007 22:17) *

но если в 3ем регистре будет хранится номер команды то где хранить параметры этой команды?

Не понимаю в чем сложность. Эмулируется по сути такая команда:
если А>Б тогда переход 5; ( или if a>b then goto 5;)
И выглядит это так:
0000111 000001 000010 000101 (если 7 - это проверка на больше например)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

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

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


Цитата(Malice @ 1.12.2007 22:32) *

Не понимаю в чем сложность. Эмулируется по сути такая команда:
если А>Б тогда переход 5; ( или if a>b then goto 5;)
И выглядит это так:
0000111 000001 000010 000101 (если 7 - это проверка на больше например)

if a>b then goto 5 ну для такого условия проблем никаких а если if a>b then c:=a+b?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

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

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


Цитата(blackhard @ 1.12.2007 22:40) *

if a>b then goto 5 ну для такого условия проблем никаких а если if a>b then c:=a+b?

Легко !
Цитата
1 if a>b then goto 3
2 goto 4
3 c=a+b
4 ...

или
Цитата

1 if a<=b then goto 3
2 c=a+b
3 ...

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
blackhard   разработка виртуального процессора   19.11.2007 21:15
volvo   Понять, говоришь? Ну, попробуй: Виртуальный процес…   19.11.2007 21:24
blackhard   аможно в 2х словах обьяснить как в паскале вообще …   19.11.2007 22:23
blackhard   короче у меня такой вопрос:$80000000 вот это …   23.11.2007 0:07
Malice   короче у меня такой вопрос:$80000000 вот это…   23.11.2007 0:51
blackhard   уф я понял как написать прогу :) токо я так и не …   23.11.2007 1:46
Malice   длинна команды 3 байта включает в себя код операц…   23.11.2007 2:33
blackhard   Преобразовать команды и номера регистров в 3 байт…   27.11.2007 1:23
Malice   а можно небольшой комментарий я не знаком с опера…   27.11.2007 2:01
blackhard   Program processor; Uses CRT; type treg=record ob…   24.11.2007 1:25
blackhard   ну че никто мне не поможет?помогите очень прошу :)   26.11.2007 23:00
Malice   ну че никто мне не поможет?помогите очень прошу :…   27.11.2007 0:56
blackhard   а сколько бит в паскале занимает один символ напри…   27.11.2007 23:26
Malice   1 символ занимает 1 байт, а байт это: http://ru.wi…   27.11.2007 23:51
blackhard   а как сделать чтобы все элементы reg[i].obozn мас…   28.11.2007 20:09
blackhard   вобщем опять нужна помощь.доделал прогу и отправил…   1.12.2007 3:30
Lapp   если я напишу такую команду прога попросит ввести…   1.12.2007 13:51
blackhard   Нет, так процессоры не работают. Они вообще ниче…   1.12.2007 16:35
blackhard   вот начал переделывать прогу для работы с машинным…   1.12.2007 21:44
Mlc   У тебя на код команды отводится 6 бит, а команд на…   1.12.2007 22:24
blackhard   опять проблема и опять с условием: если на ассембл…   2.12.2007 1:27
Malice   У тебя при выполнении условия должен выполнятся пе…   2.12.2007 1:51
blackhard   У тебя при выполнении условия должен выполнятся п…   2.12.2007 2:17
Malice   но если в 3ем регистре будет хранится номер коман…   2.12.2007 2:32
blackhard   Не понимаю в чем сложность. Эмулируется по сути т…   2.12.2007 2:40
Malice   if a>b then goto 5 ну для такого условия пробл…   2.12.2007 2:45
blackhard   Легко ! или блин действительно легко спасиб…   2.12.2007 2:52


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

 





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