Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ разработка виртуального процессора

Автор: blackhard 19.11.2007 21:15

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

Автор: volvo 19.11.2007 21:24

Цитата
мнеб хотяб понять как это делать
Понять, говоришь? Ну, попробуй:
http://forum.pascal.net.ru/index.php?s=&showtopic=3473&view=findpost&p=31391

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

Автор: blackhard 19.11.2007 22:23

аможно в 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 23.11.2007 0:07

короче у меня такой вопрос:

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

Автор: Malice 23.11.2007 0:51

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

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

поменяй на $20

Автор: blackhard 23.11.2007 1:46

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

Автор: Malice 23.11.2007 2:33

Цитата(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

Автор: blackhard 24.11.2007 1:25

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 вот собственно названия команд

Автор: blackhard 26.11.2007 23:00

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

Автор: Malice 27.11.2007 0:56

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

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

На твой вопрос о переводе 3-х байтовой команды в 4 шести битовых значения и обратно я написал в предыдущем посте. Остальное тебе понятно..

Автор: blackhard 27.11.2007 1:23

Цитата(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

Автор: Malice 27.11.2007 2:01

Цитата(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-х следующих байт.
Почитай про битовые операции, это просто ;)

Автор: blackhard 27.11.2007 23:26

а сколько бит в паскале занимает один символ например 'A'?

Автор: Malice 27.11.2007 23:51

1 символ занимает 1 байт, а байт это:
http://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82

Автор: blackhard 28.11.2007 20:09

а как сделать чтобы все элементы reg[i].obozn массива занимали 6 бит?и можно ли после этого сравнивать
их с элементами st[m] где на символ по прежнему 8 бит?

Автор: blackhard 1.12.2007 3:30

вобщем опять нужна помощь.доделал прогу и отправил препаду,а он написал что она должна работать с командами заданными в машинном коде
сейчас она работает вот с такими командами
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 ? и тоже самое с командой условия как задать <>= такие знаки ?

Автор: Lapp 1.12.2007 13:51

Цитата(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.

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

Автор: blackhard 1.12.2007 16:35

Цитата(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 килобайт ) Кол-во скачиваний: 167

Автор: blackhard 1.12.2007 21:44

вот начал переделывать прогу для работы с машинным кодом сделал вначале только для 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;
а то я чето не врубаюсь че делать со знаками условия

Автор: Mlc 1.12.2007 22:24

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

Автор: blackhard 2.12.2007 1:27

опять проблема и опять с условием: если на ассемблере у меня условие выглядело так
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;

Автор: Malice 2.12.2007 1:51

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

Автор: blackhard 2.12.2007 2:17

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

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

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

Автор: Malice 2.12.2007 2:32

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

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

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

Автор: blackhard 2.12.2007 2:40

Цитата(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?

Автор: Malice 2.12.2007 2:45

Цитата(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 ...


Автор: blackhard 2.12.2007 2:52

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

Легко !

или

блин действительно легко спасибо за помощь smile.gif