Язык ассемблера ASMololo

Архитектура вычислительной машины

    • Данные и код хранятся отдельно друг от друга. (Архитектура не Фон-Неймоновская)
    • Адресуемое пространство данных (память) — 2^32 слов:
      • Адреса находятся в диапазоне (0, 2^32-1)
      • Адрес — целое 32 битовое число со знаком
      • Адресуемая ячейка памяти — целое 32 битовое число со знаком
      • Выделенное количество памяти может быть меньше, по умолчанию - 1 Мб, 2^18 слов.
    • Программа — это упорядоченный набор инструкций.
      • Каждая инструкция имеет номер, на который могут ссылаться команды условного и безусловного переходов.
      • Команды нумеруются целыми числами, начиная с 0
    • Регистры являются внутренней памятью вычислителя
      • 4 регистра общего назначения: r0, r1, r2, r3.
      • Размер регистра - слово.

Типы операндов

Для арифметических операций доступны следующие типы операндов:

    1. Целочисленная константа.
    2. Например: 5
    3. Регистр.
    4. Например: r1
    5. Прямая адресация: адрес в памяти указывается непосредственно.
    6. Например: [100]
    7. (ячейка памяти с адресом 100)
    8. Косвенная регистровая адресация: указывается регистр, в котором записан адрес.
    9. Например: [r0]
    10. (в регистре 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, если верхнее число меньше

Замечание: первый операнд арифметической инструкции должен быть регистром.

Замечание 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