feat(runtime): Implement add sub mult and div opcodes
Implement calculation of add sub mult and div operations
This commit is contained in:
parent
780042035c
commit
896d2c6f7b
3 changed files with 121 additions and 2 deletions
10
runtime/BinCmdMap.h
Normal file
10
runtime/BinCmdMap.h
Normal 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
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
CC=gcc
|
||||
CFLAGS=-I.
|
||||
DEPS=OperandStack.h
|
||||
DEPS=OperandStack.h BinCmdMap
|
||||
OBJ=OperandStack.o salruntime.o
|
||||
|
||||
%.o: %.c $(DEPS)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue