Files
Interpreter/Doc/isa/指令集清单.md
T
Admin c9024a060b U5 定案:内建 FB 14 条全部 v1 实现(6 计数拆条 + 定时/触发 5 + SR/RS、PWM、RTC 3)
- 指令集清单 §8:SR/RS、PWM、RTC 状态 扩展→核心
- 指令集优化:§9.2 U5 闭合、§4 A3 行更新、决策历史补记
2026-08-24 15:40:55 +08:00

16 KiB
Raw Blame History

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

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

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

  • 字节 0 = 长度前缀 + 形态分区 + 主操作码:11/10+op:64B)、011/010 xxx+op:28B)、0010/0011+op:416B)、0001+op:432B
  • 字节 1 = [func:4 | 空:4](空位待全部编码后定)
  • 形态由前缀分区表达fmt 位段已取消,零查表):11=RR、10=NONE、011=RRR、010 000/001/010/011/100/101=IMM/SLOT/JMP/JC/CALL/CAL、0010=SLOT+off、0011=IMM64
  • func(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、=无类型(编码 0 保留)
  • disasm 按 func 显示类型后缀(A7 定案):func=3 → LOAD.I16 r5, s3
  • 无类型指令(跳转/调用/RET/NOP/CALfunc 编码为 0(不使用)
  • 010 区 8 条(LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL)形态由前缀分区直推:见指令编码.md §5

1. 前缀分区与字段位号

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

字段 位号 说明
长度前缀+形态分区 4B: bit7..611=RR / 10=NONE);8B: bit7..5011=RRR / 010=其他 6 形态分区:bit4..2 形态位 + bit1..0 子 op);16B: bit7..40010=SLOT+off / 0011=IMM64);32B: bit7..40001=预留) 长度与形态分区一体
opcode 4B: bit5..0 / 8B: bit4..0 / 16B: bit3..0 / 32B: bit3..0 分区内独立编号(0 起)
func bit15..12 功能细节(宽度×符号/浮点),语义随 op
(空) bit11..8 待全部指令编码完后决定用途

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

前缀 形态 长度组 操作数区字段位号 识别方式
11 RR 4B rd=23..16、rs=31..24 前缀直推
10 NONE 4B pad=31..16 前缀直推
011 RRR 8B rd=23..16、rs1=31..24、rs2=39..32、pad=63..40 前缀直推
010 000 IMM 8B rd=23..16、imm32=55..24、pad=63..56 前缀直推
010 001 SLOT 8B rd=23..16、slot32=55..24、pad=63..56 前缀直推
010 010 JMP 8B off32=47..16、pad=63..48 前缀直推
010 011 JC 8B rd=23..16、off32=55..24、pad=63..56 前缀直推
010 100 CALL 8B fn_id32=47..16、pad=63..48 前缀直推
010 101 CAL 8B fb_id16=31..16、slot32=63..32 前缀直推
0010 SLOT+off 16B rd=23..16、slot32=55..24、off32=87..56、pad=127..88 前缀直推
0011 IMM64 16B rd=23..16、imm64=87..24、pad=127..88 前缀直推
0001 预留 32B 操作数区 30Bbit 240..16),格式待定

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

RR(前缀 114B = bit31..0

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

NONE(前缀 104B = bit31..0

bit31           16 bit15 12 bit11 8 bit7      0
┌──────────────────┬─────────┬───────┬───────────┐
│ pad:16 (31..16)  │ func:4  │ 空:4  │ 前缀10+op:6│
└──────────────────┴─────────┴───────┴───────────┘

RRR(前缀 0118B = 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  │ 空:4  │ 前缀011+op5│
│                 │ (39..32) │ (31..24) │ (23..16) │ (15..12)│(11..8)│   (7..0)   │
└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴───────────┘

010 区(8B = bit63..0:前缀 010 + 3 位形态位(bit4..2+ 2 位子 opbit1..0)——形态全部直推:

IMM(010000):  rd=23..16、imm32=55..24、pad=63..56
SLOT(010001): rd=23..16、slot32=55..24、pad=63..56
JMP(010010):  off32=47..16、pad=63..48
JC(010011):   rd=23..16、off32=55..24、pad=63..56
CALL(010100): fn_id32=47..16、pad=63..48
CAL(010101):  fb_id16=31..16、slot32=63..32

SLOT+off(前缀 001016B = bit127..0

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

IMM64(前缀 001116B = bit127..0

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

32B 预留(前缀 0001:操作数区 30B(bit 240..16),格式待实现时定稿。

2. 数据搬运

指令 字节0 编码 fmt func 操作数 语义 状态
MOVE 4B 11000000 RR 宽度:0=1B/1=2B/2=4B/3=8B rd, rs 寄存器搬运(只搬宽度,不管符号/浮点) 核心
LOAD 8B 01000100 SLOT 全矩阵 0..9 rd, slot 槽→寄存器(按 func 读宽+扩展) 核心
STORE 8B 01000101 SLOT 全矩阵 0..9 slot, rs 寄存器→槽(按 func 写宽) 核心
LOADK 8B 01000000 IMM 全矩阵 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 00110000 IMM64 全矩阵 0..9 rd, imm64 64 位立即数内嵌(免查表) 预留

3. 逻辑与位运算

指令 字节0 编码 fmt func 操作数 语义 状态
NOT 4B 11000001 RR 无符号宽度 0/2/4/6 rd, rs BOOL 逻辑非 / 位串按位取反 核心
AND 8B 01100110 RRR 无符号宽度 0/2/4/6 rd, ra, rb 按宽度逐位与(BOOL 由编译器保证 0/1) 核心
OR 8B 01100111 RRR 无符号宽度 0/2/4/6 rd, ra, rb 逐位或 核心
XOR 8B 01101000 RRR 无符号宽度 0/2/4/6 rd, ra, rb 逐位异或 核心
NAND 8B 01101001 RRR 无符号宽度 0/2/4/6 rd, ra, rb 逐位与非 扩展
NOR 8B 01101010 RRR 无符号宽度 0/2/4/6 rd, ra, rb 逐位或非 扩展
XNOR 8B 01101011 RRR 无符号宽度 0/2/4/6 rd, ra, rb 逐位同或 扩展
SHL 8B 01101100 RRR 无符号宽度 0/2/4/6 rd, rs, n 左移(n 在 rb 扩展
SHR 8B 01101101 RRR 0..7(宽度×符号,算术/逻辑右移) rd, rs, n 右移 扩展
ROL 8B 01101110 RRR 无符号宽度 0/2/4/6 rd, rs, n 循环左移(位串) 扩展
ROR 8B 01101111 RRR 无符号宽度 0/2/4/6 rd, rs, n 循环右移 扩展
GETBIT 8B 01110110 RRR rd, rs, bit 取位(bit 在 rb 扩展
SETBIT 8B 01110111 RRR rd, rs, bit 置位 扩展
CLRBIT 8B 01111000 RRR rd, rs, bit 清位 扩展
TOGBIT 8B 01111001 RRR rd, rs, bit 翻转位 扩展

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

4. 算术

指令 字节0 编码 fmt func 操作数 语义 状态
ADD 8B 01100000 RRR 全矩阵 0..9 rd, ra, rb 整数饱和 / 浮点 IEEE / 无符号 核心
SUB 8B 01100001 RRR 全矩阵 0..9 rd, ra, rb 核心
MUL 8B 01100010 RRR 全矩阵 0..9 rd, ra, rb 核心
DIV 8B 01100011 RRR 全矩阵 0..9 rd, ra, rb 除(整数零除/浮点 ±inf 核心
MOD 8B 01100100 RRR 0..7(整数) rd, ra, rb 取模 扩展
EXPT 8B 01100101 RRR 0..9 rd, ra, rb 扩展
NEG 4B 11000010 RR 0..9 rd, rs 取负 扩展
ABS 4B 11000011 RR 0..9 rd, rs 绝对值 扩展
INC 4B 11000100 RR 0..9 rd, rs 自增 扩展
DEC 4B 11000101 RR 0..9 rd, rs 自减 扩展
SQRT 4B 11000110 RR 浮点 8/9 rd, rs 平方根 扩展
SIN 4B 11000111 RR 浮点 8/9 rd, rs 正弦 扩展
COS 4B 11001000 RR 浮点 8/9 rd, rs 余弦 扩展
TAN 4B 11001001 RR 浮点 8/9 rd, rs 正切 扩展
ASIN 4B 11001010 RR 浮点 8/9 rd, rs 反正弦 扩展
ACOS 4B 11001011 RR 浮点 8/9 rd, rs 反余弦 扩展
ATAN 4B 11001100 RR 浮点 8/9 rd, rs 反正切 扩展
LN 4B 11001101 RR 浮点 8/9 rd, rs 自然对数 扩展
LOG 4B 11001110 RR 浮点 8/9 rd, rs 常用对数 扩展
EXP 4B 11001111 RR 浮点 8/9 rd, rs 指数 扩展
ROUND 4B 11010000 RR 浮点 8/9 rd, rs 四舍五入(浮点→整数) 扩展
TRUNC 4B 11010001 RR 浮点 8/9 rd, rs 截断 扩展
FLOOR 4B 11010010 RR 浮点 8/9 rd, rs 向下取整 扩展
CEIL 4B 11010011 RR 浮点 8/9 rd, rs 向上取整 扩展

5. 比较

指令 字节0 编码 fmt func 操作数 语义 状态
CMP_EQ 8B 01110000 RRR 全矩阵 0..9 rd, ra, rb 相等 核心
CMP_NE 8B 01110001 RRR 全矩阵 0..9 rd, ra, rb 不等 核心
CMP_LT 8B 01110010 RRR 全矩阵 0..9 rd, ra, rb 小于(无符号/浮点按 func 核心
CMP_LE 8B 01110011 RRR 全矩阵 0..9 rd, ra, rb 小于等于 核心
CMP_GT 8B 01110100 RRR 全矩阵 0..9 rd, ra, rb 大于 核心
CMP_GE 8B 01110101 RRR 全矩阵 0..9 rd, ra, rb 大于等于 核心

6. 转换

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

7. 控制流

指令 字节0 编码 fmt func 操作数 语义 状态
JMP 8B 01001000 JMP off32 无条件跳转(相对下一条,字节) 核心
JT 8B 01001100 JC rd, off rd≠0 跳转 核心
JF 8B 01001101 JC rd, off rd==0 跳转 核心
CALL 8B 01010000 CALL fn_id 压帧调用(r0..r7 复制) 核心
RET 4B 10000001 NONE 弹帧 / MAIN 周期结束 核心
CAL 8B 01010100 CAL 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 00100010 SLOT+off 字符串长度 预留
STR_CMP 16B 00100011 SLOT+off 比较 预留
STR_EQ 16B 00100100 SLOT+off 相等 预留
STR_MID 16B 00100101 SLOT+off 取子串 预留
STR_LEFT 16B 00100110 SLOT+off 左侧子串 预留
STR_RIGHT 16B 00100111 SLOT+off 右侧子串 预留
STR_CONCAT 32B 00010001 预留 拼接 预留
STR_FIND 32B 00010010 预留 查找 预留
STR_REPLACE 32B 00010011 预留 替换 预留

10. 数组(未来)

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

11. 系统

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

12. op 预算核对(前缀分区按组分治)

前缀 分区 op 空间 已分配 指令 余量
11 RR 64 21 MOVE/NOT/NEG/ABS/INC/DEC/浮点单目 10/舍入 4/CONV 43
10 NONE 64 2 NOP/RET 62
011 RRR 32 26 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 6
010 000..010 101 IMM/SLOT/JMP/JC/CALL/CAL 6×4 8 LOADK(1)/LOAD·STORE(2)/JMP(1)/JT·JF(2)/CALL(1)/CAL(1) 16(含 2 个预留形态区)
0010 SLOT+off 16 8 LOAD_OFF/STORE_OFF + 字符串 6 8
0011 IMM64 16 1 LOADK64 15
0001 预留 16 6 JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE 10

编码约定:op 按分区独立编号;无类型指令 func=0;010 区形态由前缀分区直推(指令编码.md §5); 字符串/数组的具体操作数形态在实现时定稿(0001 区)。