该文档描述了 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 | 空操作,占位 |