This repo contains an implementation of C++ computer simulation. It has it's own memory, and is able to execute assembler language commands.
It uses c++ templates and metaprogramming.
Instructions:
-
Id(const char*) - Creates a label.
-
Numerical values examples:
Num<13>, Num<0>, Num<-50>. -
Mem - Access the memory with addres "Addr", which must be a valid p-value.
Examples:
Mem<Num<0>>, Mem<Lea<Id("a")>>. -
Lea - returns the addres of variable named with id "Id".
Examples:
Lea<Id("A")>, Lea<Id("a")>. -
l-values: Mem.
-
r-alues Mem, Num, Lea.
-
D<Id, Value> - declares a variable with id "Id" and value of "Value"
Examples:
D<Id("A"), Num<5>>. -
Mov<Dst, Src> - copies value of Src into Dst, Dst must be a valid l-value, and Src must be a valid r-value
Examples:
Mov<Mem<Num<0>>, Num<13>>, Mov<Mem<Lea<Id("abc")>>, Mem<Num<0>>>. -
Arithmetic operation:
Add<Arg1, Arg2> -Adds Arg2 to Arg1.
Sub<Arg1, Arg2> -Substracts from Arg1, Arg2.bstracts from Arg1, Arg2.
Inc - Increments Arg
Dec - Decrements Arg
Flags (works like in ASM):- ZF (zero flag)
- SF (sign flag)
Examples:
Add<Mem<Num<0>>, Num<1>>, Inc<Mem<Lea<Id("a")>>>.
- ZF (zero flag)
-
Logic operators:
And<Arg1, Arg2>
Or<Arg1, Arg2>
Result is stored in Arg1.
Not
Flags:- ZF (zero flag)
Examples:
And<Mem<Num<0>>, Num<1>>, Not<Mem<Lea<Id("a")>>>.
- ZF (zero flag)
-
Cmp<Arg1, Arg2> works like Sub<x,y> but doesn't change the Arg1, only sets flags.
Example: Cmp<Mem<Num<0>>, Num<1>>. -
Label<Id("label")> - creates a Label, that can be accesed later.
-
Conditional jumps
Jmp - jumps to a label
Jz - jumps if Label ZF is set to 1.
Js - jumps if Label SF is set to 1.
Example:
Jmp<Id("label")>, Jz<Id("stop")>.
Example usages are listed in common folder.