指令集清单(V2 编码定案)
状态:已编码。全功能指令清单,全部指令已按 指令编码.md 的
RISC-V 式格式(前缀长度组 + op + func + fmt)分配编码。
状态列:核心 = v1 实现;扩展 = v1 后实现;预留 = 仅留编码/未来。
编码规则摘要(详见指令编码.md)
- 字节 0 = 长度前缀 + 主操作码:
1+op:7(4B)、01+op:6(8B)、001+op:5(16B)、0001+op:4(32B)
- 字节 1 =
[func:4 | fmt:4]
- func(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、
—=无类型(编码 0 保留)
- fmt:0=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/CAL)func 编码为 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. 内建 FB(CAL + fb_id,fb 表)
| 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 空间 |
已分配 |
指令 |
余量 |
| 4B(op:7) |
128 |
23 |
MOVE/NOP/NOT/RET/NEG/ABS/INC/DEC + 浮点单目 10 + 舍入 4 + CONV |
105 |
| 8B(op:6) |
64 |
34 |
算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 + LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF 8 |
30 |
| 16B(op:5) |
32 |
10 |
LOAD_OFF/STORE_OFF/LOADK64 + 字符串 6 + ARR_LEN |
22 |
| 32B(op:4) |
16 |
6 |
JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE |
10 |
编码约定:op 按组独立编号;无类型指令 func=0;SETBIT 系列的目标可槽形式与
字符串/数组的具体操作数形态在实现时定稿(fmt 列「预留」)。