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

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

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

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


Бывалый
***

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Профи
****

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

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


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


Бывалый
***

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

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


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

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

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

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


Профи
****

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

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


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

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

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


Бывалый
***

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Профи
****

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Бывалый
***

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

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


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

Легко !

или

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

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

 





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