bug na funcao write_int
[myPerl.git] / vm.c
blob97ac2c10dc2a80824aaa161d4cb5066e6028e8c6
1 #include <stdio.h>
2 #include <assert.h>
3 #include "heap.h"
4 #include "code.h"
5 #include "vm.h"
7 #define STACK_SIZE 4096
9 static int top = -1;
10 static int stack[STACK_SIZE];
12 static int pc = 0; /* program counter */
14 static void
15 bin_arith_op(char op)
17 assert(top >= 1);
18 switch(op) {
19 case '+':
20 stack[top-1] = stack[top-1] + stack[top];
21 break;
22 case '-':
23 stack[top-1] = stack[top-1] - stack[top];
24 break;
25 case '*':
26 stack[top-1] = stack[top-1] * stack[top];
27 break;
28 case '/':
29 stack[top-1] = stack[top-1] / stack[top];
30 break;
31 case '%':
32 stack[top-1] = stack[top-1] % stack[top];
33 break;
34 default:
35 fprintf(stderr, "Operacao %c nao reconhecida\n", op);
36 break;
38 --top;
39 pc++;
42 void
43 vm_halt(int arg)
47 void
48 vm_add(int arg)
50 bin_arith_op('+');
53 void
54 vm_sub(int arg)
56 bin_arith_op('-');
59 void
60 vm_mul(int arg)
62 bin_arith_op('*');
65 void
66 vm_div(int arg)
68 bin_arith_op('/');
71 void
72 vm_mod(int arg)
74 bin_arith_op('%');
77 void
78 vm_load_var(int arg)
80 stack[++top] = data_get(arg);
81 pc++;
84 void
85 vm_load_int(int arg)
87 stack[++top] = arg;
88 pc++;
91 void
92 vm_store(int arg)
94 assert(top >= 0);
95 data_put(arg, stack[top]);
96 top--;
97 pc++;
100 void
101 vm_jmp_false(int arg)
103 if (stack[top] == 0)
104 pc = arg;
105 else
106 pc++;
109 void
110 vm_goto(int arg)
112 pc = arg;
115 void
116 vm_write_int(int arg)
118 printf("%d\n", stack[top]);
119 top--;
120 pc++;
123 void
124 vm_call(int arg)
126 pc++;
130 vm_loop(void)
132 while (code[pc].op != HALT) {
133 ops[code[pc].op].op(code[pc].arg);
136 return 0;