Реализация учебной машины трёхадресной
Исходная программа на языке УМ3 записывается на перфокарту (punched_card.txt).
Программа состоит из команд (одна на одну строку), написанных в мнемоническом коде:
<address> <command> <op1> <op2> <op3> [; <комментарий>]
Где:
<address> - целое число от 0 до 511, номер ячейки памяти, в который будет записана команда.
<op1>, <op2>, <op3> (по 9 бит) - целые числа от 0 до 511, чаще всего определяют адреса операндов,
но также по принципу неразличимости команд и данных могут представлять число в 512-чной системе счисления
(если <command> = 0, то из 3 цифр, иначе с 4-ой цифрой <= 31).
<command>(5 бит) - целое число от 0 до 31 или название команды, определяет выполняемую команду.
Список доступных команд:
0 или "MOV": отправляет содержимое ячейки с адресом op3 в ячейку с адресом op1
Считается, что в ячейках вещественные числа
1 или "ADDREAL": <op1> := <op2> + <op3>
2 или "SUBREAL": <op1> := <op2> - <op3>
3 или "MULREAL": <op1> := <op2> * <op3>
4 или "DIVREAL": <op1> := <op2> / <op3>
6 или "INREAL" : вводит из консоли op2 чисел в ячейки с адресами <op1>, <op1 + 1>, ... , <op1 + op2 - 1>
7 или "OUTREAL": выводит числа в консоль, из тех же адресов, что и в "INREAL"
9 или "JUMP": безусловный переход на команду по адресу op2, RA := op2
10 или "RTOI": преобразование типа из вещесвтенного в целый, <op1> := longint(<op3>)
Считается, что в ячейках целые знаковые числа
11 или "ADDINT": <op1> := <op2> + <op3>
12 или "SUBINT": <op1> := <op2> - <op3>
13 или "MULINT": <op1> := <op2> * <op3>
14 или "DIVINT": <op1> := <op2> div <op3>
15 или "MOD" : <op1> := <op2> mod <op3>
16 или "ININT" : ввод и вывод аналогичны вещественным числам
17 или "OUTINT"
19 или "IF" : команда условного перехода, зависит от значения omega: 0, RA := op1; 1, RA := op2; 2, RA := op3
20 или "PR" : if omega = 0 RA := op2 Переход Равно
21 или "PNR": if omega != 0 RA := op2 Переход Не Равно
22 или "PB" : if omega = 2 RA := op2 Переход Больше
23 или "PM" : if omega = 1 RA := op2 Переход Меньше
24 или "PBR": if omega != 1 RA := op2 Переход Больше Равно
25 или "PMR": if omega != 2 RA := op2 Переход Меньше Равно
30 или "ITOR": преобразование целого в вещественный, <op1> := real(<op3>)
31 или "END": выход из программы
Остается ещё 7 доступных номеров для команд, поэтому буду рад Вашим идеям и предложеним.
Некоторые дополнения к УМ3
После выполнения программы в файл log.txt записывается список всех выполненых команд и небольшое описание,
а в файл memory.txt ячейки памяти, которые были задействованы во время программы.
При загрузке перфокарты в память будет выполнена проверка на корректность, которая с точностью до строки
и операнда сообщит тип синтаксической ошибки.
Во время выполнения программа будет сообщать о некоторых ошибках счета, таких как деление на ноль,
переполнение типа или менее фатальный некорректный ввод числа, который будет предложено исправить.
Больше информации (units 3, 5): http://arch32.cs.msu.ru/Page2.htm
Моя почта: [email protected]