Язык ассемблера ASMololo
Архитектура вычислительной машины
- Данные и код хранятся отдельно друг от друга. (Архитектура не Фон-Неймоновская)
- Адресуемое пространство данных (память) — 2^32 слов:
- Адреса находятся в диапазоне (0, 2^32-1)
- Адрес — целое 32 битовое число со знаком
- Адресуемая ячейка памяти — целое 32 битовое число со знаком
- Выделенное количество памяти может быть меньше, по умолчанию - 1 Мб, 2^18 слов.
- Программа — это упорядоченный набор инструкций.
- Каждая инструкция имеет номер, на который могут ссылаться команды условного и безусловного переходов.
- Команды нумеруются целыми числами, начиная с 0
- Регистры являются внутренней памятью вычислителя
- 4 регистра общего назначения: r0, r1, r2, r3.
- Размер регистра - слово.
Типы операндов
Для арифметических операций доступны следующие типы операндов:
- Целочисленная константа.
- Например: 5
- Регистр.
- Например: r1
- Прямая адресация: адрес в памяти указывается непосредственно.
- Например: [100]
- (ячейка памяти с адресом 100)
- Косвенная регистровая адресация: указывается регистр, в котором записан адрес.
- Например: [r0]
- (в регистре r0 записан адрес ячейки памяти)
Набор инструкций
Инструкции и операнды регистронезависимы. Например, идентификаторы Mov и mov обозначают одну и ту же инструкцию.
Перед командой может установлена строковая метка: "<имя метки>:"
Пересылка
- mov <операнд1>, <операнд2> — присвоить в операнд 1 значение операнда 2.
Замечание 1: первый аргумент не может быть константой.
Замечание 2: оба операнда одновременно не могут ссылаться в память.
Арифметика
- add <операнд1>, <операнд2> — сложить два операнда и положить результат в операнд 1.
- sub <операнд1>, <операнд2> — вычесть операнда 1 операнд 2 и положить результат операнд 1.
- mul <операнд1>, <операнд2> — умножить два операнда и положить результат в операнд 1.
- div <операнд1>, <операнд2> — разделить операнд 1 на операнд 2 и положить результат операнд 1.
- mod <операнд1>, <операнд2> — разделить операнд 1 на операнд 2 и положить остаток от деления в операнд 1.
- cmp <операнд1>, <операнд2> — сравнить два операнда и положить в операнд 1
- 0, если числа равны
- n > 0, если верхнее число больше
- n < 0, если верхнее число меньше
- cmp <операнд1>, <операнд2> — сравнить два операнда и положить в операнд 1
Замечание: первый операнд арифметической инструкции должен быть регистром.
Замечание 2: инструкция cmp - синоним для sub.
Переходы
- jmp <метка> — передать управление команде с указанной меткой.
- je <регистр>, <метка> — передать управление команде с указанной меткой, если значение регистра равно 0.
- jne <регистр>, <метка> — передать управление команде с указанной меткой, если значение регистра не равно 0.
- jg <регистр>, <метка> — передать управление команде с указанной меткой, если значение регистра больше 0.
- jng <регистр>, <метка> — передать управление команде с указанной меткой, если значение регистра не больше 0.
- jl <регистр>, <метка> — передать управление команде с указанной меткой, если значение регистра меньше 0.
- jnl <регистр>, <метка> — передать управление команде с указанной меткой, если значение регистра не меньше 0.
- hlt <операнд> – корректное завершение работы с результатом указанным в операнде.
Программа
Каждая инструкция записывается на отдельной строке файла. Рекомендуемое расширение для файла с программой - ".lolo". Рекомендуемое имя для исполняемого модуля интерпретатора - "asmo" ("asmo.exe").
Пример вызова:
> asmo fib.lolo
Комментарий начинается символом ";" и заканчивается концом строки.
Пустые строки, или строки содержащие только комментарий, игнорируются.
Порядок выполнения
- Начальное состояние:
- Регистры обнулены, состояние памяти не определено, указатель команд IP равен 0 (указывает на первую команду)
- Пока не встретили команду hlt делать следующее:
- Выполнить инструкцию №IP
- Если была выполнена инструкция перехода, то IP := <метка>, иначе увеличить IP на 1.
- Результатом выполнения программы считается аргумент команды hlt.
Примеры
Сложение чисел:
mov r0, 1
add r0, 2
hlt r0
Цикл for:
mov r0, 10
l: sub r0, 1
mov r1, 0
cmp r1, r0
jne r0, l
hlt r0