This is just an old, simple toy project and consists of a simple stack language and an interpreter for integer arithmetic.
The instruction set consists of the following instructions:
| Instruction | Description |
|---|---|
| push | Pushes element to the top of the stack |
| pop | Pops (retrieves) top element from stack |
| add | Pops 2 top most elements from stack, performs an addition and pushed result back to the stack |
| sub | Same as for "add", but performs subtraction |
| mul | Same as for "add", but performs multiplication |
| div | Same as for "add", but performs division (checks for division by 0) |
| cmpl | Checks 2 top most stack elements (true, if Arg1 < Arg2, 0 otherwise) |
| cmpg | Checks 2 top most stack elements (true, if Arg1 > Arg2, 0 otherwise) |
| cmple | Checks 2 top most stack elements (true, if Arg1 <= Arg2, 0 otherwise) |
| cmpge | Checks 2 top most stack elements (true, if Arg1 >= Arg2, 0 otherwise) |
| cmpeq | Checks 2 top most stack elements (true, if Arg1 == Arg2, 0 otherwise) |
| cmpne | Checks 2 top most stack elements (true, if Arg1 != Arg2, 0 otherwise) |
| Pops top element from stack and prints its value | |
| jmp | Unconditional jump to label |
| jfalse | Conditional jump to label |
| L | Label (used for go to markers) |
| r | Register definition (for variables) |
| shl | Binary left shift |
| shr | Binary right shift |
| rol | Binary rotate left |
| ror | Binary rotate right |
| not | Binary NOT |
| and | Binary AND |
| xor | Binary Exclusive Or |
| mod | Modulo |
For a detailed description on eREGS you may check the documentation located in the doc directory (german only).
Just run make all to compile the interpreter.
🛑 (This is just a spontaneously uploaded git repository and the Makefile may not work properly as of now).
- Make
- Yacc
- Flex
Just run ./bin/eregs <eREGS SOURCEFILE> to run the interpreter.
A "eREGS" source code may use up to 32 registers and 999 labels (jump markers).
C commentary style // for single line comments and /* for multiline comments */ are also supported.
The following example shows how to compute the average of the two numbers 22 and 48 in a not so obvious way 😈.
push $22
push $48
xor
pop r1
push $1
push r1
shr
pop r1
push $22
push $48
and
push r1
add
printSee the examples directory for more examples on how to use the eREGS stack language.