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