虚拟机保护的示例代码, 用于了解vmp。
- _bc:字节码指令数组(程序代码)
- pc:程序计数器(Program Counter),指向当前执行的指令
- stack:操作数栈,用于临时存储数据
- vars:变量存储区(类似寄存器或内存)
| opcode | insn | Description |
|---|---|---|
| 1 | push | 将下一个字节作为立即数压入栈 |
| 2 | add | 弹出栈顶两个值,相加后压回栈 |
| 4 | 弹出栈顶值并打印 | |
| 6 | jmp | 无条件跳转到指定地址 |
| 7 | jz | 弹出栈顶值,若为0则跳转(条件跳转) |
| 8 | load | 从变量数组加载值到栈 |
| 9 | Text | 将栈顶值存入变量数组 |
| 11 | lt | 比较操作:弹出两值,若 a < b 则压入1,否则压入0 |
let x = 0;
while (x < 3) {
console.log(x);
x = x + 1;
}
// other
for (let i = 0; i < 3; i++) {console.log(i)}- 初始化:vars[0] = 0(将0存入变量0)
- 循环开始(地址4):
- 加载 vars[0] 到栈
- 压入立即数 3
- 比较是否小于(vars[0] < 3)
- 如果结果为0(false),跳转到地址24(结束)
- 循环体:
- 加载并打印 vars[0] 的值
- 加载 vars[0],压入 1,相加
- 将结果存回 vars[0](即自增1)
- 无条件跳转回地址4(继续循环)