(Копия
блога на Технотреке)
Summary
На этом занятии мы применяли стек для вычислений, записанных в обратной польской записи. Это простая вещь, но мы на этом не остановились, и, пройдя несколько итераций разработки, сконструировали процессор, работающий по загружаемым в него программам. Наш процессор реализован в виде структуры и состоит из стека для временных данных для вычислений, нескольких регистров и оперативной памяти, в которой размещается программа. По ходу дела мы разобрали несколько простых, но важных моментов:
- В любой непонятной ситуации делай новую структуру :)
- Для процессора коды команд лучше, чем их названия;
- Для человека названия команд лучше, чем их коды;
- Противоречие п.2 - п.3 решается введением понятия компиляции. Радостные, пишем ассемблер и дизассемблер;
- Один только стек для хранения данных неудобен, вводим регистры. Чтобы доступ был легок и быстр, переменную клади в регистр;
- Операции с регистрами изменили работу команд, вводим заголовок исполняемого байт-кода, содержащий версию системы команд.
- Задумались о сравнении величин, условных операторах (переходах) и о том, как указывать место назначения перехода. Пока остановились на том, что просто будем писать адрес перехода, что, конечно, неудобно.
Домашнее задание
Последовательно, итеративно, шаг за шагом, step-by-step, pеализуйте:
1. Версию процессора, работающего с именами команд (push, pop, add, sub, mul, div, sin, cos, sqrt). Команды достают свои аргументы из стека (кроме push) и кладут в стек результат операции;
2. Версию процессора, работающего с кодами команд, загружаемых в оперативную память процессора, ассемблер и дизассемблер для него;
3. Версию процессора с регистрами (ax, bx, cx, dx, whatever). Очень советую тут оглядеться вокруг и посмотреть, какие есть вообще процессорные архитектуры, и, может быть, как-то по-своему обойтись с регистрами;
4*. Версию процессора с возможностью брать данные из оперативной памяти и класть их в нее;
5. Версию процессора с условными и безусловными переходами. Команды переходов такие:
jmp - jump, безусловный переход
je - jump if equal, переход, если числа равны
jne - jump if not equal, переход, если числа не равны
ja - jump if above, переход, если одно число больше другого
jae - jump if above or equal, переход, если одно число больше или равно другому
jb - jump if below, переход, если одно число меньше другого
jbe - jump if below or equal, переход, если одно число меньше или равно другому
jm -
jump maybe (jump там обозначается как branch)
jt -
jump on tuesdays (там же)6. Юнит-тесты для процессора. Их проще всего организовать как набор файлов, в которых пишутся тестовые программы и ожидаемые ответы;
7. Попробуйте поломать процессор, проверьте его на прочность. Я имею в виду наш софт-процессор, не надо ломать процессор на материнской плате. :)
***
Удачи, и May the Source be with you! :)