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

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

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

 
 Ответить  Открыть новую тему 
> Виртуальный процессор, Процессор я уже накписал... помогите с программой к нему
сообщение
Сообщение #1


Гость






Мне нужен был виртуальный процессор, ниже список команд есть. Надо чтобы команда была 1 байт ( включаетв в себя код операции 4 бита, и номер регистра 4 бита). Первый операнд берется из регистра, второй из сумматора.. результат в сумматор.

Написать программу для вычисления суммы первых n натуральных чисел.

т.к сумматр это тотже регистр у него есть адрес 0101
1100 0000 Переносим из сумматора в регистр 0000 команды
0001 0000 - ввод в регистр с номером 0000 если нужно ввести в сумматор указыаем номер сумматра
0010 0000 -вывод из регистра 0000 если нужно ввести в сумматор указыаем номер сумматра
0011 0000- операция сложения межу регистром 0000 и сумматром
0100 0000-операция вычитания между регистром 0000 и сумматром
0101 0000-умножения значения в регистре 0000 и сумматром
0110 0000-деление -//-
1010 0000-оператор перехода на заданную строку 0000
1001 0000 -оператор условия = между регистром 0000 и сумматром если tru то выполняем действие указанное на следующейстроке
если false не выполняем действие на следующей строке и идем дальше
0111 0000 -оператор условия >между регистром 0000 и сумматром если tru то выполняем действие указанное на следующейстроке
если false не выполняем действие на следующей строке и идем дальше
1000 0000-оператор условия < между регистром 0000 и сумматром если tru то выполняем действие указанное на следующейстроке
если false не выполняем действие на следующей строке и идем дальше
1011 0000 Переносим из регистра в сумматор


Вот сам код:
0001 0101
1100 1111
0100 1111
1100 0011
1011 1111
1100 1111
0101 1111
1100 0001
0011 0011
1100 0011
1011 1111
0100 0011
1100 0001
1011 1111
0110 0011
0111 0011
1010 0110
0010 0001


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



Вот код процессора:

Program processor;
Uses CRT;
type treg=record
obozn:char;
chislo:integer;
end;
var a:array[1..50] of string;
st,st2:string;ch:char;
n,m,k,t:byte;
reg:array[1..26] of treg;
f:text;
s:string;
function finish:boolean;
var ch:char;
begin
writeln('prodoljit y or press any key');
ch:=readkey;
if upcase(ch)='Y'
then
finish:=false
else finish:=true;
end;
procedure fail;
begin
writeln('ўл § Јаг§Ё«Ё Є®¤:');
assign(f,'23.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[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
if reg[i].obozn=r then
if (st[11+m]<>'0') and (st[12+m]<>'1') then
begin
if r='5' then writeln('ўўҐ¤ЁвҐ зЁб«® ў б㬬 в®а')
else
writeln('ўўҐ¤ЁвҐ зЁб«® ў ॣЁбва ',r);
readln(reg[i].chislo);
end;
end;
procedure SumReg;
var i,j:1..10;
s,r,c:string;
k,Iv,n:integer;
begin
s:='';
r:='';
c:='';
str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
if reg[i].obozn=r then
begin
reg[i].chislo:=reg[5].chislo;
end;
end;
procedure RegSum;
var i,j:1..10;
s,r,c:string;
k,Iv,n:integer;
begin
s:='';
r:='';
c:='';
str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
if reg[i].obozn=r then
begin
reg[5].chislo:=reg[i].chislo;
end;
end;
procedure Output;
var i:1..10;
n:integer;
r:string;
begin
r:='';
str(todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
if reg[i].obozn=r then
begin
if r='5' then writeln('зЁб«® ў б㬬 в®аҐ = ',reg[i].chislo)
else
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[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if '5'=reg[5].obozn then b:=reg[5].chislo;
s:=a+b;
end;
for i:=1 to 10 do
begin
if '5'=reg[5].obozn then reg[5].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[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if '5'=reg[5].obozn then b:=reg[5].chislo;
s:=a-b;
end;
for i:=1 to 10 do
begin
if '5'=reg[5].obozn then reg[5].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[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if '5'=reg[5].obozn then b:=reg[5].chislo;
s:=a*b;
end;
for i:=1 to 10 do
begin
if '5'=reg[5].obozn then reg[5].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[6+m]+st[7+m]+st[8+m]+st[9+m],2),r);
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if '5'=reg[5].obozn then b:=reg[5].chislo;
s:=Round( b div a );
end;
writeln(s);
for i:=1 to 10 do
begin
if '5'=reg[5].obozn then reg[5].chislo:=s;
end;
end;
procedure wentto;
var
x,Iv:integer;
i:1..10;
begin
x:=todec(st[6+m]+st[7+m]+st[8+m]+st[9+m],2);
k:=x-1;
end;
procedure Uslov;
var a,b,x:integer;
i:1..10;
f:boolean;
r,c,d:string;
begin
str(todec(st[8+m]+st[9+m]+st[10+m]+st[11+m]+st[12+m]+st[13+m],2),r);
f:=false;
for i:=1 to 10 do
begin
if r=reg[i].obozn then a:=reg[i].chislo;
if '5'=reg[5].obozn then b:=reg[5].chislo;
end;
case ToDec(st[1]+st[2]+st[3]+st[4],2) of
9:if a=b then f:=true;
7:if a>b then f:=true;
8:if a<b then f:=true;
end;
if f=true then
begin
x:=t+1;
k:=x-1;
end;
if f=false then
begin
x:=t+2;
k:=x-1;
end;
end;
procedure ras;
begin
k:=1;
while k<>n do
begin
st:=a[k];
t:=k;
st2:=a[k+1];
if ord(st[1])<58 then
begin
m:=0;
case ToDec(st[1]+st[2]+st[3]+st[4],2) of

1:Input;
2:Output;
3:add;
4:sub;
5:mult;
6:divis;
7:uslov;
8:uslov;
9:uslov;
10:wentto;
11: regsum;
12: SumReg;
end;
end;
k:=k+1;
end;
end;
procedure registr;
var i:integer;
begin
for i:=49 to 59 do
reg[i-48].obozn:=chr(i)
end;
BEGIN
repeat
clrscr;
registr;
fail;
ras;
until finish;
end.


 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Или можете хотя бы на ассемблере написать программу к моему процессору
 К началу страницы 
+ Ответить 

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

 





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