Files
Interpreter/Doc/isa/指令集清单.md
T
Admin ed78f06e29 指令集清单:全部指令按 RISC-V 式编码(前缀+op / func / fmt)
- 4B 组 23 条(MOVE/NOP/NOT/RET/算术单目/浮点/舍入/CONV)
- 8B 组 34 条(算术/逻辑/移位/位操作/CMP/数据/调用/跳转)
- 16B 组 10 条(字段访问/LOADK64/字符串/数组长度)
- 32B 组 6 条预留(JTBL/复杂字符串/数组索引)
- func 语义按指令族(MOVE=宽度、LOAD/算术=全矩阵、浮点单目=8/9)
- 内建 FB fb_id 0..13(TON..RTC);op 预算余量表
2026-08-24 14:45:35 +08:00

10 KiB
Raw Blame History

指令集清单(V2 编码定案)

状态:已编码。全功能指令清单,全部指令已按 指令编码.md 的 RISC-V 式格式(前缀长度组 + op + func + fmt)分配编码。 状态列:核心 = v1 实现;扩展 = v1 后实现;预留 = 仅留编码/未来。

编码规则摘要(详见指令编码.md

  • 字节 0 = 长度前缀 + 主操作码:1+op:74B)、01+op:68B)、001+op:516B)、0001+op:432B
  • 字节 1 = [func:4 | fmt:4]
  • func(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、=无类型(编码 0 保留)
  • fmt0=RR、1=RRR、2=IMM、3=SLOT、4=JMP、5=JC、6=CALL、7=CAL、8=NONE
  • disasm 按 func 显示类型后缀(A7 定案):func=3 → LOAD.I16 r5, s3
  • 无类型指令(跳转/调用/RET/NOP/CALfunc 编码为 0(不使用)

1. 数据搬运

指令 字节0 编码 fmt func 操作数 语义 状态
MOVE 4B 10000000 RR(0) 宽度:0=1B/1=2B/2=4B/3=8B rd, rs 寄存器搬运(只搬宽度,不管符号/浮点) 核心
LOAD 8B 01011010 SLOT(3) 全矩阵 0..9 rd, slot 槽→寄存器(按 func 读宽+扩展) 核心
STORE 8B 01011011 SLOT(3) 全矩阵 0..9 slot, rs 寄存器→槽(按 func 写宽) 核心
LOADK 8B 01011100 IMM(2) 全矩阵 0..9 rd, const_id 常量表→寄存器(按 func 解释) 核心
LOAD_OFF 16B 00100000 SLOT+off 全矩阵 0..9 rd, slot, off 字段读(结构体/FB 共享体) 核心
STORE_OFF 16B 00100001 SLOT+off 全矩阵 0..9 slot, off, rs 字段写 核心
LOADK64 16B 00100010 IMM64 全矩阵 0..9 rd, imm64 64 位立即数内嵌(免查表) 预留

2. 逻辑与位运算

指令 字节0 编码 fmt func 操作数 语义 状态
NOT 4B 10000010 RR(0) 无符号宽度 0/2/4/6 rd, rs BOOL 逻辑非 / 位串按位取反 核心
AND 8B 01000110 RRR(1) 无符号宽度 0/2/4/6 rd, ra, rb 按宽度逐位与(BOOL 由编译器保证 0/1) 核心
OR 8B 01000111 RRR(1) 无符号宽度 0/2/4/6 rd, ra, rb 逐位或 核心
XOR 8B 01001000 RRR(1) 无符号宽度 0/2/4/6 rd, ra, rb 逐位异或 核心
NAND 8B 01001001 RRR(1) 无符号宽度 0/2/4/6 rd, ra, rb 逐位与非 扩展
NOR 8B 01001010 RRR(1) 无符号宽度 0/2/4/6 rd, ra, rb 逐位或非 扩展
XNOR 8B 01001011 RRR(1) 无符号宽度 0/2/4/6 rd, ra, rb 逐位同或 扩展
SHL 8B 01001100 RRR(1) 无符号宽度 0/2/4/6 rd, rs, n 左移(n 在 rb 扩展
SHR 8B 01001101 RRR(1) 0..7(宽度×符号,算术/逻辑右移) rd, rs, n 右移 扩展
ROL 8B 01001110 RRR(1) 无符号宽度 0/2/4/6 rd, rs, n 循环左移(位串) 扩展
ROR 8B 01001111 RRR(1) 无符号宽度 0/2/4/6 rd, rs, n 循环右移 扩展
GETBIT 8B 01011000 RRR(1) rd, rs, bit 取位(bit 在 rb 扩展
SETBIT 8B 01011001 RRR(1) rd, rs, bit 置位 扩展
CLRBIT 8B 01011010 RRR(1) rd, rs, bit 清位 扩展
TOGBIT 8B 01011011 RRR(1) rd, rs, bit 翻转位 扩展

注:SETBIT/CLRBIT/TOGBIT 的"目标可槽"形式(slot, bit)后续可在 16B 组扩展(op 预留)。

3. 算术

指令 字节0 编码 fmt func 操作数 语义 状态
ADD 8B 01000000 RRR(1) 全矩阵 0..9 rd, ra, rb 整数饱和 / 浮点 IEEE / 无符号 核心
SUB 8B 01000001 RRR(1) 全矩阵 0..9 rd, ra, rb 核心
MUL 8B 01000010 RRR(1) 全矩阵 0..9 rd, ra, rb 核心
DIV 8B 01000011 RRR(1) 全矩阵 0..9 rd, ra, rb 除(整数零除/浮点 ±inf 核心
MOD 8B 01000100 RRR(1) 0..7(整数) rd, ra, rb 取模 扩展
EXPT 8B 01000101 RRR(1) 0..9 rd, ra, rb 扩展
NEG 4B 10000100 RR(0) 0..9 rd, rs 取负 扩展
ABS 4B 10000101 RR(0) 0..9 rd, rs 绝对值 扩展
INC 4B 10000110 RR(0) 0..9 rd, rs 自增 扩展
DEC 4B 10000111 RR(0) 0..9 rd, rs 自减 扩展
SQRT 4B 10001000 RR(0) 浮点 8/9 rd, rs 平方根 扩展
SIN 4B 10001001 RR(0) 浮点 8/9 rd, rs 正弦 扩展
COS 4B 10001010 RR(0) 浮点 8/9 rd, rs 余弦 扩展
TAN 4B 10001011 RR(0) 浮点 8/9 rd, rs 正切 扩展
ASIN 4B 10001100 RR(0) 浮点 8/9 rd, rs 反正弦 扩展
ACOS 4B 10001101 RR(0) 浮点 8/9 rd, rs 反余弦 扩展
ATAN 4B 10001110 RR(0) 浮点 8/9 rd, rs 反正切 扩展
LN 4B 10001111 RR(0) 浮点 8/9 rd, rs 自然对数 扩展
LOG 4B 10010000 RR(0) 浮点 8/9 rd, rs 常用对数 扩展
EXP 4B 10010001 RR(0) 浮点 8/9 rd, rs 指数 扩展
ROUND 4B 10010010 RR(0) 浮点 8/9 rd, rs 四舍五入(浮点→整数) 扩展
TRUNC 4B 10010011 RR(0) 浮点 8/9 rd, rs 截断 扩展
FLOOR 4B 10010100 RR(0) 浮点 8/9 rd, rs 向下取整 扩展
CEIL 4B 10010101 RR(0) 浮点 8/9 rd, rs 向上取整 扩展

4. 比较

指令 字节0 编码 fmt func 操作数 语义 状态
CMP_EQ 8B 01010000 RRR(1) 全矩阵 0..9 rd, ra, rb 相等 核心
CMP_NE 8B 01010001 RRR(1) 全矩阵 0..9 rd, ra, rb 不等 核心
CMP_LT 8B 01010010 RRR(1) 全矩阵 0..9 rd, ra, rb 小于(无符号/浮点按 func 核心
CMP_LE 8B 01010011 RRR(1) 全矩阵 0..9 rd, ra, rb 小于等于 核心
CMP_GT 8B 01010100 RRR(1) 全矩阵 0..9 rd, ra, rb 大于 核心
CMP_GE 8B 01010101 RRR(1) 全矩阵 0..9 rd, ra, rb 大于等于 核心

5. 转换

指令 字节0 编码 fmt func 操作数 语义 状态
CONV 4B 10010110 RR(0) 目标类型 0..9 rd, rs 类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) 扩展

6. 控制流

指令 字节0 编码 fmt func 操作数 语义 状态
JMP 8B 01011111 JMP(4) off32 无条件跳转(相对下一条,字节) 核心
JT 8B 01100000 JC(5) rd, off rd≠0 跳转 核心
JF 8B 01100001 JC(5) rd, off rd==0 跳转 核心
CALL 8B 01011101 CALL(6) fn_id 压帧调用(r0..r7 复制) 核心
RET 4B 10000011 NONE(8) 弹帧 / MAIN 周期结束 核心
CAL 8B 01011110 CAL(7) fb_id, slot 内建 FB 调用(fb_id 查 fb 表) 核心
JTBL 32B 00010000 预留 rd, slot, n CASE 跳转表 预留

7. 内建 FBCAL + fb_idfb 表)

fb_id FB 字段(类型化) 状态
0 TON in/pt/q/et = BOOL/TIME/BOOL/TIME 核心
1 TOF 同上 核心
2 TP 同上 核心
3 CTU cu/r/pv(INT)/q/cv(INT) 单字 核心
4 DCTU cu/r/pv(DINT)/q/cv(DINT) 双字 核心
5 CTD cd/ld/pv(INT)/q/cv(INT) 核心
6 DCTD cd/ld/pv(DINT)/q/cv(DINT) 核心
7 CTUD cu/cd/r/lu/pv(INT)/qu/qd/cv(INT) 核心
8 DCTUD cu/cd/r/lu/pv(DINT)/qu/qd/cv(DINT) 核心
9 R_TRIG clk/q = BOOL/BOOL 核心
10 F_TRIG clk/q = BOOL/BOOL 核心
11 SR / RS s1/r/s/q… 扩展
12 PWM in/pt/q… 扩展
13 RTC 日期时钟字段 扩展

8. 字符串(未来,元数据段 + 16/32B)

指令 字节0 编码 fmt 语义 状态
STR_LEN 16B 00100011 SLOT+off 字符串长度 预留
STR_CMP 16B 00100100 SLOT+off 比较 预留
STR_EQ 16B 00100101 SLOT+off 相等 预留
STR_MID 16B 00100110 SLOT+off 取子串 预留
STR_LEFT 16B 00100111 SLOT+off 左侧子串 预留
STR_RIGHT 16B 00101000 SLOT+off 右侧子串 预留
STR_CONCAT 32B 00010011 预留 拼接 预留
STR_FIND 32B 00010001 预留 查找 预留
STR_REPLACE 32B 00010010 预留 替换 预留

9. 数组(未来)

指令 字节0 编码 fmt 语义 状态
ARR_LEN 16B 00101001 SLOT+off 数组长度 预留
ARR_LOAD 32B 00010100 预留 索引读(基槽+index 预留
ARR_STORE 32B 00010101 预留 索引写 预留

10. 系统

指令 字节0 编码 fmt func 操作数 语义 状态
NOP 4B 10000001 NONE(8) 空操作(占位/对齐) 核心

11. op 预算核对(前缀编码按组分治)

op 空间 已分配 指令 余量
4Bop:7 128 23 MOVE/NOP/NOT/RET/NEG/ABS/INC/DEC + 浮点单目 10 + 舍入 4 + CONV 105
8Bop:6 64 34 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 + LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF 8 30
16Bop:5 32 10 LOAD_OFF/STORE_OFF/LOADK64 + 字符串 6 + ARR_LEN 22
32Bop:4 16 6 JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE 10

编码约定:op 按组独立编号;无类型指令 func=0;SETBIT 系列的目标可槽形式与 字符串/数组的具体操作数形态在实现时定稿(fmt 列「预留」)。