Вариант №29
Разработать ассемблер и интерпретатор для учебной виртуальной машины (УВМ). Система команд УВМ представлена далее.
Для ассемблера необходимо разработать читаемое представление команд УВМ. Ассемблер принимает на вход файл с текстом исходной программы, путь к которой задается из командной строки. Результатом работы ассемблера является бинарный файл в виде последовательности байт, путь к которому задается из командной строки. Дополнительный ключ командной строки задает путь к файлулогу, в котором хранятся ассемблированные инструкции в духе списков “ключ=значение”, как в приведенных далее тестах.
Интерпретатор принимает на вход бинарный файл, выполняет команды УВМ и сохраняет в файле-результате значения из диапазона памяти УВМ. Диапазон также указывается из командной строки.
Форматом для файла-лога и файла-результата является yaml.
Необходимо реализовать приведенные тесты для всех команд, а также написать и отладить тестовую программу.
Загрузка константы
| A | B | C |
|---|---|---|
| Биты 0—3 | Биты 4—7 | Биты 8—32 |
| 14 | Адрес | Константа |
Размер команды: 5 байт. Операнд: поле C. Результат: регистр по адресу, которым является поле B
Тест (A=14, B=13, C=629):
0xDE, 0x75, 0x02, 0x00, 0x00
Чтение значения из памяти
| A | B | C | D |
|---|---|---|---|
| Биты 0—3 | Биты 4—7 | Биты 8—11 | Биты 12—26 |
| 10 | Адрес | Адрес | Смещение |
Размер команды: 4 байт. Операнд: значение в памяти по адресу, которымявляется сумма адреса (регистр по адресу, которым является поле C) и смещения(поле D). Результат: регистр по адресу, которым является поле B.
Тест (A=10, B=7, C=13, D=333):
0x7A, 0xDD, 0x14, 0x00
Запись значения в память
| A | B | C |
|---|---|---|
| Биты 0—3 | Биты 4—7 | Биты 8—11 |
| 0 | Адрес | Адрес |
Размер команды: 2 байт. Операнд: регистр по адресу, которым является поле C. Результат: значение в памяти по адресу, которым является регистр по адресу, которым является поле B
Тест (A=0, B=6, C=4):
0x60, 0x04
Унарная операция: побитовое "не"
| A | B | C | D |
|---|---|---|---|
| Биты 0—3 | Биты 4—7 | Биты 8—22 | Биты 23—26 |
| 1 | Адрес | Смещение | Адрес |
Размер команды: 4 байт. Операнд: значение в памяти по адресу, которым является сумма адреса (регистр по адресу, которым является поле B) и смещения (поле C). Результат: регистр по адресу, которым является поле D.
Тест (A=1, B=6, C=87, D=11):
0x61, 0x57, 0x80, 0x05
Тестовая программа: Выполнить поэлементно операцию побитовое "не" над вектором длины 7. Результат записать в исходный вектор.
pip install pyyaml
cd target_4
python assembler.py input_assembler.asm output_assembler.bin log_assembler.yaml
python interpreter.py output_assembler.bin results.yaml 128
cd target_4
python -m unittest test_assembler.py
python -m unittest test_interpreter.py



