-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvmp_example.js
More file actions
36 lines (35 loc) · 1.33 KB
/
vmp_example.js
File metadata and controls
36 lines (35 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 字节码指令数组(程序代码)
const _bc = [1, 0, 9, 0, 8, 0, 1, 3, 11, 7, 24, 8, 0, 4, 8, 0, 1, 1, 2, 9, 0, 6, 4];
let pc = 0; // 程序计数器(Program Counter),指向当前执行的指令
const stack = []; // 操作数栈,用于临时存储数据
const vars = []; // 变量存储区(类似寄存器或内存)
while (pc < _bc.length) {
switch (_bc[pc++]) {
case 1:
stack.push(_bc[pc++]); // 读取一个数据,并压入栈顶. 相当于 push
break;
case 2:
stack.push(stack.pop() + stack.pop()); // 弹出栈顶两个数据并相加,并压入栈顶. 相当于 add
break;
case 4:
console.log(stack.pop()); // 弹出栈顶数据并打印. 相当于 print
break;
case 6:
pc = _bc[pc]; // 跳转. 跳转到指定位置. 相当于 goto
break;
case 7:
if (stack.pop() === 0) pc = _bc[pc]; else pc++; // 条件跳转. 跳转到指定位置.
break;
case 8:
stack.push(vars[_bc[pc++]]); // 读取变量. 读取变量值并压入栈顶.
break;
case 9:
vars[_bc[pc++]] = stack.pop(); // 赋值. 弹出栈顶数据并赋给变量.
break;
case 11: {
const b = stack.pop(), a = stack.pop();
stack.push(a < b ? 1 : 0); // 比较. 弹出栈顶两个数据并比较,将结果压入栈顶.
break;
}
}
}