#include #include #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; }