Public feed
#381344
#include <stdio.h>
#include <stdlib.h>
#include "vm.h"
void vm(struct instruction *code)
{
struct state state;
struct state stack[4096];
struct state *sp = stack;
struct instruction cur;
state.pc = 0;
while(1) {
cur = code[state.pc++];
switch(cur.op) {
case ADD:
state.regs[cur.c] = state.regs[cur.a] + state.regs[cur.b];
break;
case SUB:
state.regs[cur.c] = state.regs[cur.a] - state.regs[cur.b];
break;
case MUL:
state.regs[cur.c] = state.regs[cur.a] * state.regs[cur.b];
break;
case DIV:
state.regs[cur.c] = state.regs[cur.a] / state.regs[cur.b];
break;
case CMP:
if(state.regs[cur.a] == state.regs[cur.b])
state.regs[cur.c] = 0;
else if(state.regs[cur.a] < state.regs[cur.b])
state.regs[cur.c] = -1;
else if(state.regs[cur.a] > state.regs[cur.b])
state.regs[cur.c] = 1;
break;
case JMP:
state.pc = cur.a;
break;
case JMPI:
if(state.regs[cur.a] == 0)
state.pc = cur.b;
break;
case SAVE:
*sp++ = state;
break;
case REST:
state = *--sp;
break;
case HALT:
return;
case PRINT:
printf("%d ", state.regs[cur.a]);
break;
}
}
}
int main(int argc, char **argv)
{
struct instruction *code = malloc(10000);
struct instruction *ptr = code;
FILE *fd = fopen(argv[1], "rb");
while(!feof(fd)) {
fread(&ptr->op, sizeof(enum op_code), 1, fd);
fread(&ptr->a, sizeof(word), 1, fd);
fread(&ptr->b, sizeof(word), 1, fd);
fread(&ptr->c, sizeof(word), 1, fd);
ptr++;
}
vm(code);
return 0;
}