Files
Interpreter/Doc/isa/指令集清单.md
T
Admin fda4f7a3ec 指令集清单:新增 §1 fmt 格式与字段位号(opcode/func/imm/rs1/rs2/rd 逐位标注)
- 1.1 通用头部位号表(长度前缀/opcode/func/fmt)
- 1.2 fmt 位号总表(11 形态 + 预留,操作数区 bit16 起)
- 1.3 各位图:RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE/SLOT+off/IMM64
  逐位标注(含 pad 填充位);32B 预留格式待定
- 16B 形态分配 fmt 9(SLOT+off)/10(IMM64);指令编码.md 同步
- 原指令章节顺延为 2..12
2026-08-24 15:01:54 +08:00

19 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. fmt 格式与字段位号

1.1 通用头部(字节 0 + 字节 1,所有指令相同)

字段 位号 说明
长度前缀 4B: bit7 / 8B: bit7..6 / 16B: bit7..5 / 32B: bit7..4 1 / 01 / 001 / 0001
opcode 4B: bit6..0 / 8B: bit5..0 / 16B: bit4..0 / 32B: bit3..0 组内独立编号(0 起)
func bit15..12 功能细节(宽度×符号/浮点),语义随 op
fmt bit11..8 操作数形态(下表)

1.2 fmt 位号总表(操作数区 = bit16 起;pad = 对齐填充,编码固定 0)

fmt 形态 长度组 操作数区字段位号
0 RR 4B rd=23..16、rs=31..24
1 RRR 8B rd=23..16、rs1=31..24、rs2=39..32、pad=63..40
2 IMM 8B rd=23..16、imm32=55..24、pad=63..56
3 SLOT 8B rd=23..16、slot32=55..24、pad=63..56
4 JMP 8B off32=47..16、pad=63..48
5 JC 8B rd=23..16、off32=55..24、pad=63..56
6 CALL 8B fn_id32=47..16、pad=63..48
7 CAL 8B fb_id16=31..16、slot32=63..32
8 NONE 4B pad=31..16
9 SLOT+off 16B rd=23..16、slot32=55..24、off32=87..56、pad=127..88
10 IMM64 16B rd=23..16、imm64=87..24、pad=127..88
11..15 预留 32B 操作数区 30Bbit 240..16),格式待定

1.3 各位图(bit 从左(高)到右(低);小端字节序:字节 0 = bit0..7 在右端)

fmt=0 RR4B = bit31..0

bit31          24 bit23         16 bit15   12 bit11  8 bit7      0
┌────────────────┬────────────────┬───────────┬─────────┬───────────┐
│ rs:8 (31..24)  │ rd:8 (23..16)  │ func:4    │ fmt:4   │ 前缀1+op:7 │
└────────────────┴────────────────┴───────────┴─────────┴───────────┘

fmt=1 RRR8B = bit63..0

bit63          40 bit39    32 bit31    24 bit23    16 bit15  12 bit11 8 bit7     0
┌─────────────────┬──────────┬──────────┬──────────┬─────────┬───────┬──────────┐
│ pad:24 (63..40) │ rs2:8    │ rs1:8    │ rd:8     │ func:4  │ fmt:4 │ 前缀01+op6│
│                 │ (39..32) │ (31..24) │ (23..16) │ (15..12)│(11..8)│  (7..0)   │
└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴──────────┘

fmt=2 IMM8B = bit63..0

bit63        56 bit55       24 bit23      16 bit15 12 bit11 8 bit7     0
┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:8 (63..56)│ imm32 (55..24)│ rd:8 (23..16)│ func:4  │ fmt:4 │ 前缀01+op6│
└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘

fmt=3 SLOT8B = bit63..0

bit63        56 bit55       24 bit23      16 bit15 12 bit11 8 bit7     0
┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:8 (63..56)│ slot32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │前缀01+op6│
└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘

fmt=4 JMP8B = bit63..0

bit63       48 bit47      16 bit15 12 bit11 8 bit7     0
┌──────────────┬─────────────┬─────────┬───────┬──────────┐
│ pad:16       │ off32 (47..16)│ func:4 │ fmt:4 │前缀01+op6│
│ (63..48)     │             │ (15..12)│(11..8)│  (7..0)  │
└──────────────┴─────────────┴─────────┴───────┴──────────┘

fmt=5 JC8B = bit63..0

bit63        56 bit55       24 bit23      16 bit15 12 bit11 8 bit7     0
┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:8 (63..56)│ off32 (55..24)│ rd:8 (23..16)│ func:4  │ fmt:4 │ 前缀01+op6│
└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘

fmt=6 CALL8B = bit63..0

bit63       48 bit47      16 bit15 12 bit11 8 bit7     0
┌──────────────┬─────────────┬─────────┬───────┬──────────┐
│ pad:16       │ fn_id32     │ func:4  │ fmt:4 │前缀01+op6│
│ (63..48)     │ (47..16)    │ (15..12)│(11..8)│  (7..0)  │
└──────────────┴─────────────┴─────────┴───────┴──────────┘

fmt=7 CAL8B = bit63..0

bit63         32 bit31        16 bit15 12 bit11 8 bit7     0
┌────────────────┬──────────────┬─────────┬───────┬──────────┐
│ slot32 (63..32)│ fb_id16      │ func:4  │ fmt:4 │ 前缀01+op6│
│                │ (31..16)     │ (15..12)│(11..8)│  (7..0)   │
└────────────────┴──────────────┴─────────┴───────┴──────────┘

fmt=8 NONE4B = bit31..0

bit31           16 bit15 12 bit11 8 bit7     0
┌──────────────────┬─────────┬───────┬──────────┐
│ pad:16 (31..16)  │ func:4  │ fmt:4 │ 前缀1+op7 │
└──────────────────┴─────────┴───────┴──────────┘

fmt=9 SLOT+off16B = bit127..0

bit127         88 bit87        56 bit55       24 bit23      16 bit15 12 bit11 8 bit7      0
┌─────────────────┬──────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:40          │ off32        │ slot32       │ rd:8         │ func:4  │ fmt:4 │ 前缀001+op5│
│ (127..88)       │ (87..56)     │ (55..24)     │ (23..16)     │ (15..12)│(11..8)│   (7..0)  │
└─────────────────┴──────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘

fmt=10 IMM6416B = bit127..0

bit127         88 bit87       24 bit23      16 bit15 12 bit11 8 bit7      0
┌─────────────────┬────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:40          │ imm64      │ rd:8         │ func:4  │ fmt:4 │ 前缀001+op5│
│ (127..88)       │ (87..24)   │ (23..16)     │ (15..12)│(11..8)│   (7..0)  │
└─────────────────┴────────────┴──────────────┴─────────┴───────┴──────────┘

fmt=11..15 预留(32B:操作数区 30B(bit 240..16),格式待实现时定稿。

2. 数据搬运

指令 字节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 位立即数内嵌(免查表) 预留

3. 逻辑与位运算

指令 字节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 预留)。

4. 算术

指令 字节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 向上取整 扩展

5. 比较

指令 字节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 大于等于 核心

6. 转换

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

7. 控制流

指令 字节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 跳转表 预留

8. 内建 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 日期时钟字段 扩展

9. 字符串(未来,元数据段 + 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 预留 替换 预留

10. 数组(未来)

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

11. 系统

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

12. 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 列「预留」)。