该文档描述了 TPV 虚拟机中定义的所有操作码(Opcode),包括其功能与使用方式。
| 指令 | 参数 | 说明 |
|---|---|---|
| SETI | rd, 32bit imm | 设置寄存器为整数常量 |
| SETF | rd, 32bit imm | 设置寄存器为浮点常量 |
| SETS | rd, string | 字符串入表(去重),返回指针至 rd |
| SETNIL | rd | 设置寄存器为 NIL |
| STORE | rd, r1, 32bit imm | r1 存入表(不去重),返回索引到 rd |
| LOAD | rd, r1, 32bit imm | 从表根据索引加载至 rd,imm=0:INT, 1:FLOAT, 2:STR |
| 指令 | 参数 | 说明 |
|---|---|---|
| ADD | rd, r1, r2 | 加法 |
| SUB | rd, r1, r2 | 减法 |
| MUL | rd, r1, r2 | 乘法 |
| DIV | rd, r1, r2 | 除法 |
| NEGATE | rd, r1 | 取负数 |
| 指令 | 参数 | 说明 |
|---|---|---|
| CVT_I_D | frd, r1 | 整数转浮点 |
| CVT_D_I | rd, fr1 | 浮点转整数 |
| 指令 | 参数 | 说明 |
|---|---|---|
| HLT | 停止程序执行 | |
| JMP | 32bit imm / @label | 无条件跳转 |
| JMP_IF | r1, 32bit imm / @label | 条件跳转,若 r1 为真 |
| 指令 | 参数 | 说明 |
|---|---|---|
| EQ | rd, r1, r2 | 等于 |
| NEQ | rd, r1, r2 | 不等于 |
| GT | rd, r1, r2 | 大于 |
| GTE | rd, r1, r2 | 大于等于 |
| LT | rd, r1, r2 | 小于 |
| LTE | rd, r1, r2 | 小于等于 |
| 指令 | 参数 | 说明 |
|---|---|---|
| BITAND | rd, r1, r2 | 位与 |
| BITOR | rd, r1, r2 | 位或 |
| BITXOR | rd, r1, r2 | 位异或 |
| BITNOT | rd, r1 | 位取反 |
| BITSHL | rd, r1, imm | 左移 |
| BITSHRL | rd, r1, imm | 无符号右移 |
| BITSHRA | rd, r1, imm | 有符号右移 |
| 指令 | 参数 | 说明 |
|---|---|---|
| VMCALL | r1, r2, imm | 虚拟机系统调用: 0: 打印 r1;若 r2==1 换行 1: 输入整数至 r1 2: 输入浮点至 r1 3: 输入字符串,返回指针至 r1 |
| 指令 | 参数 | 说明 |
|---|---|---|
| PUSH | r1 | 入栈 |
| POP | rd | 出栈 |
| 指令 | 参数 | 说明 |
|---|---|---|
| SET_ARG | r1, imm | 设置函数参数 |
| GET_ARG | rd, imm | 获取函数参数 |
| CALL | rd, imm1, imm2 / @label | 函数调用,imm1=0 表示当前模块 |
| RETURN | rd | 返回值 |
| 指令 | 参数 | 说明 |
|---|---|---|
| NEW_ARRAY | rd | 新建数组 |
| SET_ARRAY | rd, r1, r2 | 设置 rd[r1] = r2 |
| GET_ARRAY | rd, r1, r2 | rd = r1[r2] |
| RM_ARRAY | rd, r1, r2 | 删除 r1[r2] |
| GET_ARRAY_LEN | rd, r1 | 获取数组长度 |
| 指令 | 参数 | 说明 |
|---|---|---|
| IGL | 非法指令(保留) | |
| NOP | 空操作,占位 |