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

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

    • Три непересекающиеся типа памяти: данные, код и стек
      • Программа и данные находятся в разных адресных пространствах. (Архитектура не Фон-Неймоновская)
    • Адресуемое пространство данных (память) — 2^20 байт:
      • Адреса находятся в диапазоне (0, 2^18-1)
      • Адрес — целое 32 битовое число со знаком
      • Адресуемая ячейка памяти — целое 32 битовое число со знаком
    • Программа — это упорядоченный набор инструкций.
      • Каждая инструкция имеет номер, на который могут ссылаться команды условного и безусловного переходов.
      • Команды нумеруются целыми числами, начиная с 0
    • Стек является внутренней памятью вычислителя
      • Арифметические команды могут принимать только операнды на стеке.
      • Любая команда, работающая с операндами на стеке, удаляет их.

    Набор команд

      • ld <адрес> — загрузить число на вершину стека из указанной ячейки памяти.
      • st <адрес> — выгрузить число с вершины стека в указанную ячейку памяти.
      • ldc <целое> — загрузить указанную константу на вершину стека.
      • add — сложить два верхних числа на стеке и положить результат на вершину стека.
      • sub — вычесть из верхнего числа на стеке следующее за ним и положить результат на вершину стека.
      • cmp — сравнить два верхних числа на стеке и положить на вершину стека
        • 0, если числа равны
        • 1, если верхнее число больше
        • -1, если верхнее число меньше
      • jmp <метка> — передать управление команде с указанной меткой.
      • br <метка> — передать управление команде с указанной меткой, если на вершине стека не 0.
      • hlt – корректное завершение работы.
      Комментарий начинается символом ";" и заканчиивается концом строки.
      Перед командой может установлена метка: "<имя метки>:"

      Порядок выполнения

        • Начальное состояние:
          Стек пуст, состояние пямяти не определено, уазатель команд IP равен 0 (указывает на первую команду)
        • Пока не встретили команду ret делать следующее:
          • Выполнить инструкцию №IP
          • Если была выполнена инструкция перехода, то IP := <метка>, иначе увеличить IP на 1.
        • Результатом выполнения программы считается состояние стека после завершения.

        Расширения

        Доступны следующие расширения базового синтаксиса:

        Пример

        Сложение чисел:

        ldc 1
        ldc 2
        add
        ret

        цикл:

        ldc 10
        st 0
        l:   ldc 1
        ld 0
        sub
        br l
        ret

        Реализация

        Пример структуры данных и синтаксического анализатора ядра StudentASM на языке Haskell: Haskell.