Язык ассембера VitASM
Архитектура вычислительной машины
Архитектура вычислительной машины
- Три непересекающиеся типа памяти: данные, код и стек
- Программа и данные находятся в разных адресных пространствах. (Архитектура не Фон-Неймоновская)
- Адресуемое пространство данных (память) — 2^20 байт:
- Адреса находятся в диапазоне (0, 2^20-1)
- Адресуемая ячейка памяти — целое 32 битовое число со знаком
- Программа — это упорядоченный набор инструкций.
- Каждая инструкция имеет номер, на который могут ссылаться команды условного и безусловного переходов.
- Команды нумеруются целыми числами, начиная с 0
- Стек является внутренней памятью вычислителя
- Арифметические команды могут принимать только операнды на стеке.
Набор команд
Набор команд
- ld <адрес> — загрузить число на вершину стека из указанной ячейки памяти.
- st <адрес> — выгрузить число с вершины стека в указанную ячейку памяти.
- ldc <целое> — загрузить указанную константу на вершину стека.
- add — сложить два верхних числа на стеке и положить результат на вершину стека.
- sub — вычесть из верхнего числа на стеке следующее за ним и положить результат на вершину стека.
- cmp — сравнить два верхних числа на стеке и положить на вершину стека
- 0, если числа равны
- 1, если первое число больше
- -1, если первое число меньше
- jmp <метка> — передать управление команде с указанным номером.
- br <метка> — передать управление команде с указанным номером, если на вершине стека не 0.
- ret – корректное завершение работы.
Порядок выполнения
Порядок выполнения
- Начальное состояние:
- Стек пуст, состояние пямяти не определено, уазатель команд IP равно 0
- Пока не встретили команду ret делать следующее:
- Выполнить инструкцию №IP
- Если была выполнена инструкция перехода, то IP := <метка>, иначе увеличить IP на 1.
- Результатом выполнения программы считается состояние стека после завершения.
Структуры данных
Структуры данных
Предполагайте, что программа представлена в типом 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 }