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

134 lines
5.9 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.
# 指令编码(V2RISC-V 式 op + func
> 状态:**定案存档**。本文独立存储 RISC-V 式指令编码设计(opcode 定功能、func 定细节),
> 与 [`指令集优化.md`](指令集优化.md)(格式/数据模型/待确认)配套。
> 定案日期:2026-08-24。
## 1. 设计原则(RISC-V 式)
```text
RISC-V: opcode 决定指令的"功能族"LOAD/STORE/OP/BRANCH…)
funct3/funct7 决定"功能细节"(宽度/符号/变体)
lb 与 lbu 同一 opcodefunct3 区分符号
本方案: op 决定指令的"功能"MOVE/LOAD/ADD…)
func 决定"功能的细节"(宽度/符号/浮点/变体)
func 的语义由 op 决定(随 op 变,不是全局统一表)
```
- **opcode 只决定指令的功能**;func 决定功能的细节
- **func 语义随 op 变**MOVE 的 func = 宽度;LOAD 的 func = 宽度×符号;ADD 的 func = 宽度×符号+浮点
## 2. 指令字结构(头两字节 + 操作数区)
```text
指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按 fmt 与长度组)
字节 0 字节 1
[前缀 | op] [func:4 | fmt:4]
↑ ↑ ↑
长度+主操作码 功能细节 操作数形态
```
### 2.1 字节 0:长度前缀 + 主操作码(前缀编码,UTF-8/RISC-V 式)
| 前缀(从最高位开始比对) | 指令长度 | op 位宽 | op 空间 |
|---|---|---|---|
| `1` | 4 字节 | 7 位 | 128 |
| `01` | 8 字节 | 6 位 | 64 |
| `001` | 16 字节 | 5 位 | 32 |
| `0001` | 32 字节(预留) | 4 位 | 16 |
- **长度自描述**:前缀本身即长度,未来 64B 可续 `00001`(无限延伸)
- **op 按组分治**:各长度组的 opcode 独立编号(4B 的 MOVE=0 与 8B 的 LOAD=0 不冲突,前缀已区分)
- 取指:读字节 0 → 前缀判定长度 → 搬整条
### 2.2 字节 1func + fmt(各 4 位)
```text
[func:4 | fmt:4]
高 4 位 = func 功能细节(宽度/符号/浮点)
低 4 位 = fmt 操作数形态
```
## 3. func 位段(4 位,16 种)
| func | 语义 | 覆盖类型(编译期映射) |
|---|---|---|
| 0 | 1 字节、无符号 | BOOL、BYTE、USINT |
| 1 | 1 字节、有符号 | SINT |
| 2 | 2 字节、无符号 | WORD、UINT |
| 3 | 2 字节、有符号 | INT |
| 4 | 4 字节、无符号 | DWORD、UDINT、DATE |
| 5 | 4 字节、有符号 | DINT |
| 6 | 8 字节、无符号 | LWORD、ULINT、DT、TOD |
| 7 | 8 字节、有符号 | LINT、TIME |
| 8 | F32 | REAL |
| 9 | F64 | LREAL |
| 10..15 | 预留 | |
- **func 语义随 op**
- MOVE:只表达**宽度**1/2/4/8B 搬运),不管符号/浮点
- LOAD/STORE:宽度×符号(读几字节 + 符号/零扩展)
- ADD/SUB/MUL/DIV:宽度×符号(整数饱和)+ F32/F64(浮点 IEEE
- 逻辑(AND/OR/NOT/位运算):宽度(BOOL 情况由编译器保证 0/1 输入)
- 跳转/调用/CAL/无类型指令:func 不使用(保留 0)
- **VM 只认 func**(10 种数据语义),无类型概念;类型语义全在编译层
## 4. fmt 位段(4 位,9 种格式 + 7 预留)
| fmt | 形态 | 说明 |
|---|---|---|
| 0 | RR | rd, rsMOVE/NOT/浮点单目) |
| 1 | RRR | rd, ra, rb(算术/比较/位运算) |
| 2 | IMM | rd, 32 位立即数(LOADK/CALL |
| 3 | SLOT | rd, slot32LOAD/STORE/CAL |
| 4 | JMP | off32 |
| 5 | JC | rd, offJT/JF |
| 6 | CALL | fn_id(独立格式,未合并) |
| 7 | CAL | fb_id, slot(独立格式,未合并) |
| 8 | NONE | 无操作数(RET/NOP |
| 9 | SLOT+off | rd, slot, off16B:结构体/FB 字段访问) |
| 10 | IMM64 | rd, imm6416B64 位立即数内嵌) |
| 11..15 | 预留 | |
- **格式不合并**fmt 4 位足够,CALL/CAL 保持独立格式(U1 闭合为"不合并"
- **16B 形态分配 fmt 9/10**SLOT+off(字段访问)、IMM64(立即数内嵌)——fmt 4 位 16 空间:0..10 用 + 11..15 预留
## 5. 长度组 × 格式族(操作数区)
| 长度组 | 格式族 | 操作数区 |
|---|---|---|
| 4B | NONE / RR | rd + rs1(各 1B |
| 8B | RRR / IMM / SLOT / JMP / JC / CALL / CAL | + rs2 + slot32/fn_id32/const_id32/off32 |
| 16B | SLOT+off(字段访问)/ IMM64 | + slot32 + off32/imm64 |
| 32B | 预留(JTBL/复杂字符串) | — |
## 6. 类型系统(编译期)→ func 映射
- **编译期**19 种 IEC 基础类型(BOOL/BYTE/WORD/DWORD/LWORD/SINT/INT/DINT/LINT/USINT/UINT/UDINT/ULINT/TIME/REAL/LREAL/DATE/TOD/DT),类型检查**严格比对**——类型不匹配编译期报错,不进 VM
- **BOOL 约束**:编译器限制 BOOL 只能填 0/1(TRUE/FALSE),其他值编译期报错;VM 无 BOOL 特例
- **运行时**VM 只认 func 的 10 种"宽度+符号+浮点"组合,机械执行
- 位串(BYTE/WORD/…)与无符号整数同 func——运算语义由 **op** 区分(SHL 是位运算指令、ADD 是算术指令)
- TIME 用 8B 有符号 func(毫秒语义在编译层)
- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释(A2 定案不变)
## 7. 与 RISC-V 的对照
| | RISC-V | 本方案 |
|---|---|---|
| 主功能 | opcode[6:0] | 前缀 + op(按长度组分治) |
| 细节 | funct33 位)/ funct7 | func4 位,10 组合) |
| 形态 | rd/rs1/rs2/imm 固定位置 | fmt4 位,9 形态) |
| 宽度×符号 | lb/lbu/lh/lhu/lw/lwu/ld | func 0..9 全矩阵 |
| 指令长 | 定长 32 位(+RVC 压缩 16 位) | 变长 4/8/16/32B(前缀编码) |
## 8. 决策历史
- 用户提出 RISC-V 式:opcode 只决定功能,func 决定细节(例:MOVE 按 func 分搬运宽度)
- func 4 位(16 种)够用;10 组合实际使用
- MOVE 只搬宽度不管符号/浮点(例为示意,宽度按 func 全矩阵 1/2/4/8B
- 19 类型 → 10 func 由编译器映射;类型检查严格,不匹配编译期报错
- BOOL 编译器强制 0/1,越界报错
- 字节 1 = [func:4 | fmt:4] → fmt 4 位 → **格式合并作废**CALL/CAL 独立格式)