Этот репозиторий содержит ассемблер и интерпретатор для простой виртуальной машины (UVM).
Этот проект предоставляет инструменты для:
- Ассемблирования: Преобразования читаемого человеком кода на языке ассемблера в бинарный код, который может быть выполнен UVM.
- Интерпретации: Выполнения собранного бинарного кода и наблюдения за результатами.
assembler.py
: Программа-ассемблер. Принимает исходный файл на языке ассемблера и выводит бинарный файл.interpreter.py
: Программа-интерпретатор. Принимает бинарный файл, выполняет его и записывает состояние памяти в XML-файл.README.md
: Этот файл.test_programs/
: Директория для хранения тестовых программ на языке ассемблера.test_output/
: Директория, куда должны сохраняться результаты тестов.
- UVM имеет 256 байт памяти.
- Аккумулятор: Единственный регистр аккумулятора для временного хранения данных.
- Счетчик Команд (PC): Отслеживает адрес выполняемой в данный момент инструкции.
- Стек: Стек для хранения промежуточных значений.
UVM поддерживает следующие инструкции:
Мнемоника | Код Операции (младшие 5 бит) | Описание | Операнды | A-поле |
---|---|---|---|---|
CONST |
0x01 | Помещает 16-битное константное значение в стек. | 16-битная константа | 0 |
LOAD |
0x02 | Помещает значение из памяти по 16-битному адресу в стек. | 16-битный адрес | 0 |
STORE |
0x03 | Извлекает значение из стека в аккумулятор (не используется напрямую для записи в память). | Нет | 0 |
SHL |
0x04 | Извлекает значение из стека и сдвигает его влево на 16-битное значение сдвига. | 16-битный сдвиг | 0 |
OUTS |
0x05 | Выводит верхнее значение из стека на стандартный вывод. | Нет | 0 |
LOAD_ACC |
0x06 | Извлекает значение из стека в аккумулятор. | Нет | 0 |
STORE_ADDR |
0x07 | Извлекает значение из стека в аккумулятор. | Нет | 0 |
STORE_VAL |
0x08 | Извлекает значение из стека. Сохраняет его в памяти по адресу, находящемуся в аккумуляторе. | Нет | 0 |
- Формат Кода Операции: Инструкции кодируются с использованием одного байта для кода операции и A-поля, и двух байтов для операнда (если применимо). Младшие 5 бит байта кода операции - это код операции. Старшие 4 бита - A-поле, которое не используется в этой версии машины.
- А-поле: 4 битное значение в байте кода операции.
-
Напишите Код на Ассемблере: Создайте текстовый файл, содержащий код на языке ассемблера UVM (например,
program.asm
). -
Соберите: Запустите ассемблер:
python assembler.py program.asm output.bin --log_file output.xml
program.asm
: Путь к исходному файлу ассемблера.output.bin
: Путь к выходному бинарному файлу.--log_file output.xml
: Путь для хранения лога.
-
Запустите Интерпретатор: Выполните собранный бинарный файл:
python interpreter.py output.bin 0 10 output.xml
output.bin
: Путь к бинарному файлу, созданному ассемблером.0
: Начальный адрес памяти для вывода в XML-файл.10
: Конечный адрес памяти для вывода в XML-файл.output.xml
: Путь к XML-файлу вывода, хранящему состояние памяти.
Примеры программ находятся в /test_programs/
, а результаты их выполнения - в /test_output/
.
CONST 10 # Поместить 10 в стек
CONST 5 # Поместить 5 в стек
SHL 2 # Сдвинуть 5 влево на 2. Результат должен быть 20
OUTS # Вывести верхнее значение стека, должно быть 20
STORE_ADDR # Извлечь из стека в аккумулятор
CONST 20
STORE_VAL # Извлечь из стека в mem[аккумулятор]
LOAD 20
OUTS # Вывести mem[20], должно быть 20
python assembler.py test_programs/example1.asm test_output/example1.bin --log_file test_output/example1.log
python interpreter.py test_output/example1.bin 0 25 test_output/example1.xml