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

166 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 指令集清单(V2 编码定案)
> 状态:**已编码**。全功能指令清单,全部指令已按 [`指令编码.md`](指令编码.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 保留)
- **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/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_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 空间 | 已分配 | 指令 | 余量 |
|---|---|---|---|---|
| 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 列「预留」)。