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

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

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

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

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