Язык ассемблера 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.