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