# stack_vm

Stack based virtual machine and assembly code compiler

## Features

- Assembly language compilation
- Binary code execution
- Assembly
  - Stack operations (push & pop)
  - Arithmetics operations
  - I/O operations

## Assembly documentation

### Example programm:

Put it into input.s

```asm
PUSH 65
OUTC
PUSH 1
ADD
OUTC
PUSH 1
ADD
OUTC
```

Run

```bash
make
./build/stack_vm build input.s
./build/stack_vm run out.bin
```

It must print first three English characters

### Commands:

- **NONE**
  Doesn't do anything
- **PUSH**
  Pushes value to stack
- **POP**
  Removes from stack top
- **ADD**
  Removes two top values in stack and pushes their sum
- **SUB**
  Removes two top values in stack and pushes substraction of them
- **MUL**
  Removes two top values in stack and pushes multiplication of them
- **DIV**
  Removes two top values in stack and pushes integer part of division
- **MOD**
  Removes two top values in stack and pushes modulo
- **IN**
  Inputs string with C I/O operators
- **OUTS**
  Outputs string with C I/O operators
- **OUTC**
  Outputs one stack element as char with I/O operators

## TODO

- Strings
- Loops
- Arrays