feat(runtime): Implement add sub mult and div opcodes

Implement calculation of add sub mult and div operations
This commit is contained in:
Laborratte 5 2024-07-21 11:25:07 +02:00
parent 780042035c
commit 896d2c6f7b
Signed by: Laborratte5
GPG key ID: 3A30072E35202C02
3 changed files with 121 additions and 2 deletions

10
runtime/BinCmdMap.h Normal file
View file

@ -0,0 +1,10 @@
#ifndef BIN_CMD_MAP
#define BIN_CMD_MAP
#define CMD_CONST 0x0001
#define CMD_ADD 0x0004
#define CMD_SUB 0x0005
#define CMD_MULT 0x0006
#define CMD_DIV 0x0007
#endif

View file

@ -1,6 +1,6 @@
CC=gcc
CFLAGS=-I.
DEPS=OperandStack.h
DEPS=OperandStack.h BinCmdMap
OBJ=OperandStack.o salruntime.o
%.o: %.c $(DEPS)

View file

@ -1,7 +1,116 @@
#include <stdio.h>
#include <stdint.h>
#include "BinCmdMap.h"
#include "OperandStack.h"
void runV1Program(FILE* program);
void add(OperandStack* stack);
void sub(OperandStack* stack);
void mult(OperandStack* stack);
void div(OperandStack* stack);
int main() {
printf("Hello, world!");
FILE* program = fopen("./test.bin", "r");
if (program == NULL) {
// TODO: check for errors (e.g. file not found)
return -1;
}
uint8_t version;
size_t nread = fread(&version, 1, 1, program);
switch (version) {
case 1:
runV1Program(program);
break;
default:
printf("Unkown binary version: %i.\n \
Probably the program was compiled with a more recent \
version.", version);
}
fclose(program);
return 0;
}
void runV1Program(FILE* program) {
OperandStack stack = {};
uint8_t opcode;
while (fread(&opcode, sizeof(opcode), 1, program) == 1) {
switch (opcode) {
case CMD_CONST:
int32_t val;
fread(&val, sizeof(int32_t), 1, program);
// TODO: check for errors
OStackPush(&stack, val);
break;
case CMD_ADD:
add(&stack);
break;
case CMD_SUB:
sub(&stack);
break;
case CMD_MULT:
mult(&stack);
break;
case CMD_DIV:
div(&stack);
break;
default:
printf("Unkown command");
}
}
// TODO check for errors
// (feof(program) == 0);
int result;
OStackPop(&stack, &result);
printf("%i\n", result);
}
void add(OperandStack* stack) {
int operandA;
int operandB;
OStackPop(stack, &operandA);
OStackPop(stack, &operandB);
int result = operandA + operandB;
OStackPush(stack, result);
}
void sub(OperandStack* stack) {
int operandA;
int operandB;
OStackPop(stack, &operandA);
OStackPop(stack, &operandB);
int result = operandA - operandB;
OStackPush(stack, result);
}
void mult(OperandStack* stack) {
int operandA;
int operandB;
OStackPop(stack, &operandA);
OStackPop(stack, &operandB);
int result = operandA * operandB;
OStackPush(stack, result);
}
void div(OperandStack* stack) {
int operandA;
int operandB;
OStackPop(stack, &operandA);
OStackPop(stack, &operandB);
int result = operandA / operandB;
OStackPush(stack, result);
}