Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2007, 22:49   #1
Сергей1
 
Регистрация: 19.11.2007
Сообщений: 3
Восклицание Задача по паскалю. 3 уровень.

Разработать виртуальный процессор для арифметических операций над целыми числами.
Система команд - арифметические операции над содержимым регистров, ввод и вывод значений регистров, условный и безусловный переход к заданной метке. Команды записываются в мнемонической форме с указанием имен трех регистров, в двух из которых содержатся операнды, а в третий записывается результат.
Дать описание системы команд и программу для вычисления значений суммы квадратов первых n натуральных чисел.

И как такое решить? Кто знает, помогите пожалуйста!
Сергей1 вне форума Ответить с цитированием
Старый 20.11.2007, 07:42   #2
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Я не понял а в чём сложности?
Операции какие: +,-,*,/ и всё?
этож обычный калькулятор получается (со специфичным синтаксисом)
zetrix вне форума Ответить с цитированием
Старый 20.11.2007, 08:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
арифметические операции над содержимым регистров, ввод и вывод значений регистров, условный и безусловный переход к заданной метке
Ой что то я не допонял, какой в калькуляторе переход может быть?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2007, 09:58   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Например:
if нажимаем "+" then goto 1;
или
case "нажимаем" of
+: сложение;
*:умножение;
puporev вне форума Ответить с цитированием
Старый 20.11.2007, 11:20   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
Восклицание

Хы круто! Давно хотел виртуальную машину написать ))

Короче цель - интерпритатор для асм-подобной программы типа

Код:
.start
  in    A, 10    ; А=10
  in    B, 20    ; В=20
  add   A, B, C  ; С=А+В

  in    A, 1     ; А=1

.loop  
  sub   C, A, B  ; B=C-A 
  cmp   B, 0     ; IF В<>0 goto .loop
  jne   .loop
  ...
  out   A
  out 	B
  out   C
  jmp   .end
  ...
.end
Тут in = mov, а out например вывод на экран. ABC - регистры. В задании ничего не сказано про память/переменные, количество регистров и т.п., так что можно упростить себе жизнь.

Короче типа так:
- За основу (как всегда =) стоит взять TParser, если интерпритатор на делфи или билдере будет
- Определить тип для "машинного кода", например
Код:
Type TCommand = record
     Operator: Byte;
     op1,op2,op3: DWord;
End;
- Сделать "память" где будет выполнятся программа
Код:
 Var Memory=array[1..1024] of TCommand;
- Как-то так отпарсить исходный текст

add A,B,C
Operator | op1 | op2 | op3

поставив в соответствие каждой команде число, например так
in = 01h
out = 02h
add = 03h
sub = 04h
mul = 05h
div = 06h
...
cmp = 1Eh
...
jne = 20h
..
А=1 В=2 С=3
получим

Код:
Memory[1].Command = 03h  // (add)
Memory[1].op1 = 01h         // (A)
Memory[1].op2 = 02h         // (B) 
Memory[1].op3 = 03h         // (C)
Для операторов перехода в op1 пусть хранится адрес прыжка - индекс массива
Для самих меток поле Command пусть будет 0
В операторе сравнения cmp - если аргумент - регистр A B или C, то пусть хранится в op2, а если число - то в op3 (хотя х/з, может это и не нужно будет)
----------
Потом останется обьявить 3 переменные для регистров и зацикленно гонять по массиву, изменяя стартовый адрес в соответствии с командами перехода и выполнять нужные действия, сравнения уже силами делфи

вот этот кусок быдет выглядеть так
.loop
sub C, A, B
cmp B, 0
jne .loop

(memory[x] = command/op1/op2/op3)
memory[1] = 0/1/0/0 operator=0, т.е. это метка, ничего не выполнять, 1-адрес текущей комманды
memory[2] = 04h/03h/01h/02h
memory[3] = 1Eh/02h/00h/00h - если op2=0, то аргумент - число, а не регистр, оно в op3
memory[4] = 20h/1/00h/00h 1 - адрес перехода

А, ну и конец программы конечно отметить как-то, например оператором END = FF/0/0/0

Вотъ. На первый взгляд сложно, но это тока если чужую писанину читать
Алгоритм приблизительно такой, конечно выделять под каждую комманду 13 байт это "вы зажрались", но поскольку больших программ не планируется, то проще работать с коммандами фиксированного размера
Надеюсь кто-то дочитает аж вот до -> ЭТОГО <- места

* А, да, ремарк: по такому алгоритму действия add/sub/mul/div выполняются для РЕГИСТРОВ, т.е. вместо
add A, 44, B (B=A+44)
придется писать
in C,44
add A, C, B

И соответственно делать проверку при разборе исходного текста, а то интерпритатор "не поймёт" когда ему передают опкод регистра, а когда просто число.

И нужно будет сделать минимум 2 прохода по исходнику, т.к. могут быть прыжки вперёд - надо ж знать адреса. Капец задачка ) Прям "Почувствуй себя Приваловым!"
пыщь

Последний раз редактировалось JTG; 20.11.2007 в 14:05.
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача по паскалю poluprogramist Помощь студентам 2 21.05.2008 21:44
Задача по Паскалю. 1 уровень сложности. Сергей1 Помощь студентам 2 19.11.2007 22:45
Текущий уровень звука ! XuMuK Win Api 3 11.10.2007 10:25
Уровень значимости Assembler'а сегодня [Kaiser] Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 15 07.09.2007 09:05