помогите сделать задание задача такая:Разработать виртуальный процессор для арифметических операций над целыми числами. Система команд-арифметические операции над содержимым регистров ввод и вывод значений регистров,условный и безусловный переход к команде заданного номера.длинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),в первых 2Х содержаться операнды, в 3й заносится результат операции. дать описание системы команд и программу для вычисления суммы квадратов первых n натуральных чисел.препод вообще ниче не обьяснил по этой теме и я блин даже не представляю как это сделать в паскале.мнеб хотяб понять как это делать
(если тебе надо "на блюдечке" программу ИМЕННО для твоего случая - можешь туда даже не ходить, предупреждаю сразу. Я привел эту ссылку ТОЛЬКО для того, чтоб ты понял, что это за задание, и как оно может решаться.)
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
уф я понял как написать прогу токо я так и не понял как сделать этодлинна команды 3 байта включает в себя код операции (6бит) и номер 3х регистров (по 6 бит),щас напишу прогу как я понял и выложу ее тут.тогда посмотрите?и поможите доделать?
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;
Если не напутал нигде
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
ну че никто мне не поможет?помогите очень прошу
Malice
27.11.2007 0:56
Цитата(blackhard @ 26.11.2007 19:00)
ну че никто мне не поможет?помогите очень прошу
На твой вопрос о переводе 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;
Если не напутал нигде
а можно небольшой комментарий я не знаком с операциями 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'?
а как сделать чтобы все элементы 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 он та и должен быть написан в машинном коде
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)
Легко !
или
блин действительно легко спасибо за помощь
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.