Язык ассемблера VitASM
Архитектура вычислительной машины
Архитектура вычислительной машины
- Три непересекающиеся типа памяти: данные, код и стек
- Программа и данные находятся в разных адресных пространствах. (Архитектура не Фон-Неймоновская)
- Адресуемое пространство данных (память) — 2^20 байт:
- Адреса находятся в диапазоне (0, 2^18-1)
- Адрес — целое 32 битовое число со знаком
- Адресуемая ячейка памяти — целое 32 битовое число со знаком
- Программа — это упорядоченный набор инструкций.
- Каждая инструкция имеет номер, на который могут ссылаться команды условного и безусловного переходов.
- Команды нумеруются целыми числами, начиная с 0
- Стек является внутренней памятью вычислителя
- Арифметические команды могут принимать только операнды на стеке.
Набор команд
Набор команд
- ld <адрес> — загрузить число на вершину стека из указанной ячейки памяти.
- st <адрес> — выгрузить число с вершины стека в указанную ячейку памяти.
- ldc <целое> — загрузить указанную константу на вершину стека.
- add — сложить два верхних числа на стеке и положить результат на вершину стека.
- sub — вычесть из верхнего числа на стеке следующее за ним и положить результат на вершину стека.
- cmp — сравнить два верхних числа на стеке и положить на вершину стека
- 0, если числа равны
- 1, если первое число больше
- -1, если первое число меньше
- jmp <метка> — передать управление команде с указанной меткой.
- br <метка> — передать управление команде с указанной меткой, если на вершине стека не 0.
- ret – корректное завершение работы.
Комментарий начинается символом ";" и заканчиивается концом строки.
Перед командой может установлена метка: "<имя метки>:"
Порядок выполнения
Порядок выполнения
- Начальное состояние:
- Стек пуст, состояние пямяти не определено, уазатель команд 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
Структуры данных для Haskell
Структуры данных для Haskell
(см. приложение)
Предполагайте, что программа представлена в типом AssemblerCode :
data Instruction a
= Ldc Integer
| Ld Addr
| St Addr
| Add
| Sub
| Cmp
| Br a
| Jmp a
| Lbl a
| Ret
deriving Show
type AssemblerCode = [Instruction String]
Пример использования:
import System
import VasmParser
main = do { getArgs >>= readFile . head >>= print . parseVA }