Files
Interpreter/Doc/isa/指令集优化.md
T
Admin ee1e06c628 指令编码:010 区也改前缀分区(形态位3+子op2),全部形态前缀直推、零查表
- 010 000/001/010/011/100/101 = IMM/SLOT/JMP/JC/CALL/CAL
- 8 条指令编码更新:LOADK=01000000、LOAD=01000100、STORE=01000101、
  JMP=01001000、JT=01001100、JF=01001101、CALL=01010000、CAL=01010100
- uses_* 全部前缀直推(无查表);三份文档同步
- 010 区预算:6 形态区 × 4 + 2 预留形态区
2026-08-24 15:33:26 +08:00

23 KiB
Raw Blame History

指令集优化(V2 规格,型号 STATOR2)

状态:规格冻结中。核心决策已全部定案(§2),本文为 V2 规格草案; §4 列出尚未确定的细节项,全部闭合后进入实现阶段。 与现状(V1)的关系:V1 编码冻结不可改(opcode 0..33、32bit 指令、8 字节定宽槽), 本优化为全新 V2 架构,.stb 格式 / 指令字 / 数据模型全部重设计,型号 bump 为 STATOR2。

1. 背景与动机

# 现状问题 优化方向
1 opcode 定义草率:34 条按语义乱序编号,无位域结构 format/宽度编码进 opcode,位掩码机械推导
2 8 字节定宽槽浪费:BOOL 只用 1/8 空间 变宽紧凑值区1/2/4/8 字节按类型)
3 变量区利用率低 值区按类型紧凑布局 + 地址 u32(4GB)
4 类型只有 BOOL/INT/TIME 扩展 IEC 全基础类型(19 种)
5 结构体无法支持 槽表引用 + LOAD 16B 变体(基槽+偏移,预留)
6 指令 32bit 固定 变长指令(长度编码在 opcode);寄存器编号维持 8 位
7 槽(变量)与初值(数据)耦合在同一格 槽表(引用)与值区(数据)解耦

2. 已定案设计

2.1 变长指令,前缀编码 + 形态分区

  • 指令长度不固定4 / 8 / 16 字节(32 字节预留);长度与形态由前缀分区一体表达(见 指令编码.md
  • 前缀分区11=RR、10=NONE4B);011=RRR、010 000/001/010/011/100/101=IMM/SLOT/JMP/JC/CALL/CAL8B);0010=SLOT+off、0011=IMM6416B);0001=预留(32B
  • fmt 位段已取消(用户定案):形态全部由前缀分区表达(含 010 区内部分区,零查表)
字节 0                     字节 1          字节 2..n(按长度组)
[前缀+形态分区 | op]       [func:4 | 空:4]  操作数区
位段 位号 内容
前缀+分区 4B: bit7..6 / 8B: bit7..5 / 16B: bit7..4 / 32B: bit7..4 长度与形态分区
op 4B: bit5..0 / 8B: bit4..0 / 16B: bit3..0 / 32B: bit3..0 分区内独立编号
func bit15..12 数据语义(宽度×符号/浮点),语义随 op
bit11..8 待全部编码完后定用途
长度组 指令长度 形态分区 操作数区
11/10 4 字节 RR / NONE rd + rs1(各 1B/ 无
011/010 8 字节 RRR / 010 区六形态(分区直推) rd+rs1+rs2 / 见指令编码.md §5
0010/0011 16 字节 SLOT+off / IMM64 rd + slot32 + off32 / rd + imm64
0001 32 字节 预留 超大立即数/未来扩展
  • 取指:读字节 0 → 前缀定总长 → 搬 4/8/16 字节
  • 推导(编码在头两字节):
    • 指令长度 + 形态 ← 前缀分区(010 区查表)
    • uses_rd/uses_ra/uses_rb ← 形态:全部前缀直推(指令编码.md §6)
    • 数据宽度/符号 ← func 位段(查 constexpr 宽度/符号表)
  • 字段访问统一为 LOAD/STORE 16B 变体LOAD rd, slot, off32(基槽 + 偏移,编译期算死)——结构体字段与 FB 共享体字段同一指令,无单独 LOADF
  • 跳转偏移字节化:off32(字节,相对下一条);pc/code_offset/code_len 全字节单位;code 段 16 字节对齐

2.2 寄存器模型(维持现状)

  • 寄存器编号 = 1 字节(8 位)→ 256 个/帧(定长)
  • 编号容量恒定关系:8bit×256 == 16bit×128 == 32bit×64 == 64bit×32(编号位宽 × 数量反比,总容量恒定)
  • 寄存器值仍 8 字节(int64);codegen register overflow (>256) 检查保留
  • 调用约定不变:r0 结果、r1..r7 参数、r8+ 变量/临时

2.3 数据模型:槽表(引用)→ 值区(数据)

槽表段(静态引用表,8B/条)           值段(初值,紧凑变宽)
┌─────────────────────────┐          ┌──────────────────────────┐
│ { addr:u32, 预留:u32 }  │ ──地址──▶ │ BOOL 1B / INT 2B(对齐)   │
│ 槽 0..n_slots-1          │          │ DINT·REAL 4B / TIME 8B   │
└─────────────────────────┘          │ 结构体 = 连续字段块(预留)  │
                                     └──────────────────────────┘
  • 访问:LOAD rd, slotaddr = 槽表[slot].addr → 值区按 type 位段读 1/2/4/8 字节;字段访问 LOAD rd, slot, off32addr + off
  • 两级间接:每次访问多一次内存读(PLC 规模无感)
  • 宽度编码进 opcodetype 位段携带宽度 + 符号,VM 无歧义读写(V1 因"变宽布局无法从槽号推断宽度"而改定宽,V2 用 type 位段化解)
  • 对齐规则:1/2/4/8 字节,编译器布局保证
  • 初值整合在 .stb 内分段(ELF 式):槽表段 / 值段 / 元数据段并列,单文件 SHA-256 校验
  • 寻址规模:全 32 位——槽号 u32(2^32 引用)、值区地址 u324GB)

2.4 类型系统:IEC 全基础类型(19 种,type:5

type 位段 type:532 种)19 个 IEC 基础类型 + 13 预留;结构体/字符串/数组不占位段(组合类型走元数据段)。

type 类型 宽度 符号 C 对应 type 类型 宽度 符号 C 对应
0 BOOL 1B bool 10 UINT 2B uint16_t
1 BYTE 1B uint8_t 11 UDINT 4B uint32_t
2 WORD 2B uint16_t 12 ULINT 8B uint64_t
3 DWORD 4B uint32_t 13 TIME 8B 有(ms) int64_t
4 LWORD 8B uint64_t 14 REAL 4B IEEE754 float
5 SINT 1B int8_t 15 LREAL 8B IEEE754 double
6 INT 2B int16_t 16 DATE 4B uint32_t(天)
7 DINT 4B int32_t 17 TOD 4B uint32_t(当日 ms)
8 LINT 8B int64_t 18 DT 8B uint64_t
9 USINT 1B uint8_t 19..31 预留
  • type 位段红利:CMP/算术按类型自动语义——无符号类型无符号比较、整数饱和到类型宽度(模板化)、浮点走 IEEE 754(无饱和,溢出→±inf)、读取按宽度+符号/零扩展
  • 浮点表示REAL 4B / LREAL 8B,值区 4/8 字节对齐;寄存器 int64 位模式搬运(REAL 低 4 字节),运算时按 type 重解释
  • 常量表契约(A2 定案):条目 = 8 字节原始值(无 tag,按位模式去重; LOADK rd, const_id8B IMM 形态)用指令 type 位段解释(读 width 字节、按符号扩展), 与 LOAD 语义统一;同一常量可被不同 type 的 LOADK 复用(字面量按上下文适配的落地)。 V1 的 {tag, value} 契约废弃。IMM64 形态(16B 内嵌 64 位值)保留编码、v1 不发射
  • ST 层19 类型名全量进关键字;进制前缀 2#/8#/16# 支持(浮点无前缀);浮点十进制字面量(1.5-2.5e3
  • 类型转换禁止隐式变量转换(赋值/比较/算术要求类型严格一致,Typecheck 阶段报错);字面量按上下文适配5 可赋 INT/REAL/DINT 等,编译期解释,非运行时转换);显式转换函数(INT_TO_REAL()v1 不做

2.5 映像格式(头 128 字节,16 对齐)

0..71   原 15 字段(magic/版本/cycle_limit/dt_ms/hash/entry/n_globals/n_i/n_q/n_m/
        n_consts/n_funcs + offset_const/funcs/code
64      offset_slots      ← 槽表段(原 offset_fb 改义,FB 并入值区)
68      offset_values     ← 值段(原 offset_data 改义)
72..103 型号标识(STATOR2
104     n_slots           ← 新增
108     n_values          ← 新增(值段字节数)
112..127 预留

段序:头 → 常量表 → 函数表 → 字节码 → 槽表段 → 值段 → 元数据段(预留) → SHA-256 尾

2.6 其他定案

  • 型号 bumpSTATOR1 → STATOR2
  • I/Q/M 六条 LOAD/STORE 合并为 LOAD/STORE 两条(单一值区,语义标签交给 sidecar)
  • LOADF 取消:结构体/FB 字段访问统一用 LOAD/STORE 16B 变体(基槽 + 偏移)
  • FB 共享体实施:16B 变体即基址寻址指令,FB 体编译一次消除内联膨胀
  • 结构体语法 v1 不实现,只留编码路径(16B 变体 + 元数据段)
  • FB 编码定案(B1/B21 条 CALSLOT 形态,8B:头 2 + fb_id:16 + slot32+ fb_id 16 位(查 machine.toml [[fb]] 表);新增内建 FB 只改配置 + VM 实现,指令格式零变化。V1 的 CAL_TON..CAL_F_TRIG 8 个 opcode 作废
  • 领域指令不进指令集(B4 定案):运动控制 / 通信等全部走 FB 库ST 层 FB + CALL + 共享体),V2 不设 EXT 服务指令——op 位段只承载基础指令

2.7 调用与内联策略(V1 现状 + V2 方向)

V1 现状

对象 V1 处理 原因
用户 FBFUNCTION_BLOCK 调用点内联展开(字节码随调用点数膨胀) 12.8 定案:FB 体访问绝对字段地址,不同实例基址不同,共享体无法复用
FUNCTIONFC 独立函数 + CALL fn_id 帧栈 FC 无状态,寄存器约定(r1..r7 / r0),无地址冲突;递归在前层被拒
内建 FBTON/CTU/…) CAL_* 指令(VM 运行时原语 do_cal 定时器/计数器是 VM 侧状态机,天然共享

V2 定案16B 变体 LOAD/STORE rd, slot, off = 基址寻址——FB 体编译一次,运行时按实例槽定位字段,消除内联膨胀。FUNCTION 仍走 CALL 帧栈;内建 FB 仍走 CAL(SLOT 形态,实例号即槽号)。

3. 与 V1 的差异对照

V1(现状) V2(定案)
指令长度 固定 32bit 变长 4/8/16B,长度在 opcode
opcode 0..33 乱序,无位域 [前缀+形态分区|op] + [func:4|空:4]
格式 9 种(RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE 形态由前缀分区表达11/10/011/010查表/0010/0011),fmt 位段取消
寄存器编号 8 位(256/帧) 8 位(256/帧,不变)
变量访问 立即数槽号直接寻址 槽表引用 → 值区(两级间接)
8B 定宽 8B 引用表({addr:u32}
值区 定宽 8B/变量 变宽紧凑1/2/4/8B
宽度信息 无(定宽) type 位段RISC-V 式)
类型 BOOL/INT/TIME 19 IEC 基础类型 + 13 预留
字段访问 无(FB 内联) LOAD/STORE rd, slot, off(结构体/FB 共用)
FB 调用 用户 FB 内联展开 基址寻址共享体(消除膨胀)
寻址空间 槽 65535512KB 槽 2^32、值区 4GB
初值 槽内 值段(逻辑分段,同文件)
跳转/pc 条数单位 字节单位
型号 STATOR1 STATOR2

4. 尚未确定项(细节,待逐项闭合)

核心决策已全部定案,以下为进入实现前需闭合的设计细节:

# 状态
A1 元数据段格式 结构体/字符串的表 schema——v1 预留但格式未定(待定)
A2 常量内嵌 vs 常量表 已定案:常量表(8B LOADK 查表);LOADK 用 type 位段解释;条目 8B 无 tag;IMM64 预留不发射
A3 内建 FB 字段类型化 已定案:字段类型化(TON: in/pt/q/et = BOOL/TIME/BOOL/TIMER_TRIG: clk/q = BOOL/BOOL);计数器单/双字(INT/DINT编码形式 = CAL 的 type 位段给计数宽度B3,说明中待确认)
A4 DATE/TOD/DT 字面量 已定案v1 不支持(类型存在,仅声明/存取/比较,无 D#/TOD#/DT# 字面量语法)
A5 算术语义细化 已定案:饱和模板化到各宽度(SINT/DINT/LINT);TIME+TIME / TIME-TIME / TIME 比较;浮点 IEEE 常规(溢出→±inf、0 除→±inf、NaN 传播,无特判);DATE/TOD/DT 不做运算(仅存取/比较)
A6 sidecar/I/O 绑定 已定案:与现状一致——绑定粒度仍 slot = 槽号(指向槽表条目),channel/bit 语义不变
A7 disasm 文本格式 已定案类型后缀形式:LOAD.I16 r5, s3STORE.U32 s1, r7ADD.F64 r1, r2, r3
A8 machine.toml V2 schema 已定案type 表 = 编译器内建基元别名bit/int8/int16/int32/int64/uint8/uint16/uint32/uint64/float32/float64):REAL→base float32=C float)、LREAL→base float64=C double),其余按位宽/符号映射;op 表 {name, op(0..63), fmt} + fmt/type 位段互锁校验
A9 字面量类型推断 已定案:按上下文适配;默认 DINT 仅作兜底语义(上下文恒存在,正常程序不触发)
A10 FB 编码 已定案(B1/B21 CAL + fb_id 16 位(查 fb 表);新增 FB 只改配置 + VM 实现

另:CALL 的 V2 确认(随 A10)——ret_pc 字节化(随跳转已定);CALL(IMM 形态)rd 恒 0;帧/寄存器约定不变(r0..r7 复制)。

未定 / 待细化(C1..C6

# 说明
C1 元数据段格式(原 A1 结构体/字符串表 schema——v1 预留但格式未定;建议 v1 定「0 长度占位段,schema 延后」
C2 头 128B 布局终稿 §2.5 字段表(64/68 改义、n_slots/n_values)需与 A8 schema 最终核对
C3 machine.toml [[fb]] 表 schema fb_id/name/字段类型(含单/双字计数 width 列)细则——随 B3 定
C4 CALL/CAL 的 rd 字段约定成文 已定「恒 0」,待写入规范文档
C5 line1 推演重算 实施阶段(阶段 5)才需要
C6 CTU/CTD/CTUD 字段表终稿 pv/cv 定 INT/DINT 后,字段宽度/对齐/偏移终稿(随 B3 定)

8. 待讨论(用户反问)

A9:什么情况下会没有上下文?(已定案)

ST 中字面量只能出现在表达式/赋值里(x := 5y + 5IF 16#FF > t THEN), 目标类型或运算操作数类型恒在,v1 无"裸字面量"位置——上下文恒存在。 因此"默认 DINT"只是防御性兜底(编译器内部缺类型时的报错路径), 正常程序不触发。结论:按上下文适配即可,默认 DINT 保留为兜底语义。已确认(2026-08-24

A10:FB 为什么会有 8 种?(已定案)

V1 的 CAL_TON..CAL_F_TRIG 是 8 个 opcode24..31),因为 V1 opcode 充足、无位段压力。 V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml 已有 [[fb]] 表 (8 条,含 opcode 字段)——可收敛为 1 个 CALSLOT 形态)+ FB 类型 id(立即数/查 fb 表)

  • 收益:op 位段省 7 个;新增 FB(如自定义内建)不加 opcode、只加配置
  • 代价:VM 按 id 分派(一次查表,可接受);disasm 需查 fb 表打印名称
  • 关联:A3 的单字/双字计数变体编码也随此定(fb 表加 width/type 列即可) 已定案(B1/B21 CAL + fb_id 16 位。

后续扩展讨论(B4/B5):领域指令(运动控制/通信)不进指令集——PLCopen 运动控制本 是 FB 库;V2 不设 EXT 服务指令,一切领域功能走 FB 库(CALL + 共享体)。op 位段预算见 B5。

5. 影响面清单

模块 改动
isa Op.h 重排(位域)、Instr.h 变长 pack/拆、Encode disasm 表驱动、Types 宽度/符号表 + 饱和模板化
compiler machine.toml V2type 表 19 条 + fmt/type 位段互锁)、MachineConfig 校验、Codec 变长、Codegen(槽表+值区布局、初值写值段、E_* 变长发射、字节化回填)、Stb 新头/段
vm Image 新头/段校验、Machine 取指变长 + 两级访问(槽表→值区)+ 按 type 读写
executor slot_bool 按 BOOL 读 1 字节(小改)
tests isa/vm/machine/codegen/compiler 全部重写;cases 20 个重新生成产物
docs 指令与映像、指令配置、stb文件格式、寄存器码、指令执行(line1 推演重算)、扫描周期、初步计划、README

6. 实施阶段(每阶段独立可验证 + 提交)

  1. 规格冻结:本文 §4 全部闭合后,重写指令与映像.md / 指令配置.md / stb文件格式.md
  2. isa 重构:变长 Instr + 位域 Op + Encode + isa_test
  3. compiler 侧machine.toml V2 + MachineConfig + Codec + Codegen + Stb + 对应测试
  4. vm 侧Image + Machine(两级访问)+ vm_test
  5. executor + 全链路cases 20 个 + cli 测试 + line1 产物重生成
  6. 文档收尾:指令执行推演、扫描周期、初步计划、README

7. 决策历史(讨论纪要)

  • 动机源起:用户质疑 opcode 定义草率;探索 format 位前缀编码(方案 A)与 uses_rd 位掩码推导
  • 数据模型演进:8B 定宽槽 →(用户提出槽表引用 + 初值分离)→ 槽表/值区两级模型
  • 宽度信息:用户选「宽度编码进 opcode」(RISC-V 式,对应「槽表条目带类型」被否)
  • 初值组织:用户选「整合 .stb 内分段」(ELF 式)
  • 寻址规模:用户选「全 32 位」(槽号 u32 + 地址 u32)
  • 指令长度:用户定「变长指令,长度编码在 opcode」;此前 128bit 固定长度方案被否
  • 寄存器:用户定「编号 8 位(256/帧)维持现状」,容量恒定式 8bit×256=16bit×128=32bit×64=64bit×32
  • 类型扩展:IEC 整数族 12 种 + REAL/LREAL= C float/double+ DATE/TOD/DT → 19 种,type:532 种)
  • 格式合并:用户确认原子类型固定后选位段方案;数位得出 type:5CALL→IMM、CAL→SLOT 形态合并,fmt 3 位
  • 调用策略:V1 用户 FB 内联 / FC CALL / 内建 CAL_*V2 用 16B 变体(基槽+偏移)实现 FB 共享体
  • LOADF 取消:用户指出 LOADF 与 LOAD 无本质区别(仅数据搬运)→ 字段访问统一 LOAD/STORE 16B 变体
  • 类型转换:用户定「禁止隐式变换,编译阶段检查」+ 字面量按上下文适配
  • 字面量:用户定支持 IEC 进制前缀(2#/8#/16#
  • A2 定案:LOADK 用 type 位段解释常量值(与 LOAD 语义统一);常量表条目 8B 无 tag;IMM64 预留不发射
  • A3..A8 定案(2026-08-24):计数器单/双字两种;DATE 字面量不支持;TIME/浮点运算按推荐;sidecar 一致;disasm 类型后缀;type 表=基元别名(REAL→float32、LREAL→float64
  • A9 定案:按上下文适配、默认 DINT 兜底(用户确认)
  • A10 定案(B1/B2):1 CAL + fb_id 16 位(查 fb 表);V1 的 8 个 CAL_* opcode 作废
  • B4 定案:领域指令(运动控制/通信)不进指令集,一律 FB 库;无 EXT 服务指令
  • B3/B5 说明中待确认:单/双字计数编码(CAL type 位段)、op 位段预算
  • 未定项记录:C1 元数据段 / C2 头终稿 / C3 fb 表 schema / C4 rd 约定成文 / C5 line1 推演 / C6 计数器字段表

9. 确认核验清单(2026-08-24 核对)

原则:未明确回答 ≠ 同意。本清单逐项记录「用户明确回答」与「待确认」, 待确认项由用户逐项表态后闭合。

9.1 已确认(用户明确回答)

# 用户回答
K1 变长指令(长度编码在 opcode 「变长指令,指令长度编码再opcode里面」
K2 寄存器 8 位编号 256/帧(容量恒定式) 「寄存器大小不变,8bit256 == 16bit128 == ...」
K3 宽度编码进 opcode(非槽表带类型) question 选「宽度编码进 opcode」
K4 初值整合 .stb 内分段(ELF 式) question 选「整合在 .stb 内分段」
K5 全 32 位寻址(槽号 u32 + 地址 u32) question 选「全 32 位寻址」
K6 type:532 种,含 DATE/TOD/DT 19 基础类型) 「B」
K7 跳转偏移字节化 「接受」
K8 I/Q/M 六条合并为 LOAD/STORE 两条 「合并」
K9 LOADF 取消(LOAD/STORE 16B 变体=字段访问) 「LOADF和普通的LOAD应该没有区别吧」
K10 ST 层类型全量(19 类型名进关键字) 「全量」
K11 禁止隐式变量转换(编译期检查) 「禁止隐式变换,只需要编译阶段检查」
K12 进制前缀(2#/8#/16# 「进制前缀」
K13 A2 常量表(LOADK type 解释、条目 8B 无 tag、IMM64 预留) 「使用常量表吧」+ 讨论
K14 A3 计数单字/双字两种都要 「需要两种,单字的和双字的计数指令都要有」
K15 A4 DATE/TOD/DT 字面量 v1 不支持 「先不支持」
K16 A5 算术语义(饱和模板/TIME±/浮点 IEEE/DATE 不运算) 「先做吧」
K17 A6 sidecar 绑定粒度一致(slot=槽号) 「应该可以保持一致」
K18 A7 disasm 类型后缀(LOAD.I16 r5, s3 「类型后缀」
K19 A8 type 表=基元别名(REAL→float32、LREAL→float64 「类型:编译器内建基元...float32-floatfloat64-double」
K20 A9 字面量按上下文适配、默认 DINT 兜底 「就这么做」
K21 B1 fb_id 16 位 「16位」
K22 B2 1 CAL + fb_id(查 fb 表) 「cal + fb_id」
K23 B4 领域指令不进指令集(运动/通信走 FB 库) 「不进指令集」

9.2 待确认(用户未明确回答)

# 事项 当前文档写法 待表态
U1 格式合并 9→7CALL→IMM、CAL→SLOTfmt 4→3 位) §2.1 已写定案 接受 / 改
U2 长度组映射 4/8/16/32B32B 预留) §2.1 已写 接受 / 改
U3 字节布局 [len:2|op:6] + [type:5|fmt:3] 两字节头 §2.1 已写 接受 / 改
U4 结构体 v1 只留编码不实现语法(原问题 5,未答) §2.6 已写"不实现" 预留 / 实现
U5 B3 最新方案fb 表拆条 CTU/DCTU/CTD/DCTD/CTUD/DCTUD6 计数 + TON/TOF/TP/R_TRIG/F_TRIG = 11 条) 用户提出,未最终确认 定案 / 改
U6 B5 op 预算:基础 23 + 余 41op:6 不扩 讨论过,未写文档 接受 / 改
U7 头 128 字节布局64/68 改义、n_slots/n_values、型号@72、112..127 预留) §2.5 已写 未细审,确认 / 改
U8 槽表条目 {addr:u32, 预留:u32} 8B §2.3 已写 确认 / 改
U9 值段对齐 1/2/4/8B 编译器保证 §2.3 已写 确认 / 改
U10 寄存器值 int648B)不变 + 调用约定 r0..r7 不变 §2.2 已写 确认 / 改
U11 CAL 编码布局(头2 + fb_id:16 + slot32 = 8B 讨论过未成文 确认 / 改
U12 C1 元数据段v1 定 0 长度占位、schema 延后 §4 建议 确认 / 改
U13 DATE/TOD/DT 表示uint32 天 / uint32 当日ms / uint64 §2.4 已写 确认 / 改
U14 CALL/CAL 的 rd 恒 0 约定成文 讨论过未成文 确认 / 改
U15 无类型指令 type=NONEMOVE/跳转/CALL/RET 等) §2.1 已写 确认 / 改
U16 off32 相对下一条公式(目标=当前+off字节单位) §2.1 已写 确认 / 改

10. 全功能指令集清单

全功能目标下的完整指令清单(10 类 ~55 条,含 op 预算核对)已拆分为独立文档: 指令集清单.md。状态列:核心 = v1 实现;扩展 = v1 后实现;预留 = 仅留编码/未来。