diff --git a/README.md b/README.md index 18f0edf..19fc5a5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ # stack_vm -Stack based virtual machine +Stack based virtual machine and assembly code compiler + +## Features + +- Assembly + - Stack operations (push & pop) + - Arithmetics operations ## TODO diff --git a/command.c b/command.c index db93a02..d97a84e 100644 --- a/command.c +++ b/command.c @@ -3,4 +3,9 @@ cmd_desc_t cmd_desc[] = { {PUSH, 1, "PUSH"}, {POP, 0, "POP"}, + {ADD, 0, "ADD"}, + {SUB, 0, "SUB"}, + {MUL, 0, "MUL"}, + {DIV, 0, "DIV"}, + {MOD, 0, "MOD"}, {NONE, 0, "NONE"}} diff --git a/command.h b/command.h index 096839e..dd340d0 100644 --- a/command.h +++ b/command.h @@ -5,6 +5,11 @@ enum command_e { PUSH, POP, + ADD, + SUB, + MUL, + DIV, + MOD, NONE }; diff --git a/run.c b/run.c index 0a2e418..de3a9e6 100644 --- a/run.c +++ b/run.c @@ -25,6 +25,46 @@ int exec(command_t cmd, stack_t *stack) case POP: stack_pop(stack); break; + case ADD: + { + int b = stack_pop(stack); + int a = stack_pop(stack); + + stack_push(stack, a + b); + } + break; + case SUB: + { + int b = stack_pop(stack); + int a = stack_pop(stack); + + stack_push(stack, a - b); + } + break; + case MUL: + { + int b = stack_pop(stack); + int a = stack_pop(stack); + + stack_push(stack, a * b); + } + break; + case DIV: + { + int b = stack_pop(stack); + int a = stack_pop(stack); + + stack_push(stack, a / b); + } + break; + case MOD: + { + int b = stack_pop(stack); + int a = stack_pop(stack); + + stack_push(stack, a % b); + } + break; case NONE: break; default: