Files
Interpreter/Doc/compiler/用例反汇编对照.md
T

130 lines
4.7 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.
# 用例反汇编对照(源码 ↔ 指令验证)
> 状态:**13 个正例全部对照通过(2026-08-26**。方法:`STCompiler` 编译 → `--dump-map`
> 取变量/槽映射 → `--disasm` 取指令序列 → 逐条对照源码语义。
> 每用例记录「源码语句 ↔ 指令序列 ↔ 结论」;完整输出见 build/audit/(临时)。
## 01_empty_main:最小映像
```text
PROGRAM MAIN → fn0: RETnregs=8, 4 字节)✓
```
## 02_bool_assign:常量表 + BOOL 字面量
| 源码 | 指令 | 结论 |
|---|---|---|
| a := TRUE | LOADK.U8 r8, 0(常量[0]=1 | ✓ |
| b := FALSE | LOADK.U8 r9, 1(常量[1]=0 | ✓ |
常量表 8B 无 tag、BOOL func=U8 ✓
## 03_short_circuit:短路 AND/OR
| 源码 | 指令 | 结论 |
|---|---|---|
| x := a AND b | MOVE r10,r8 / JF r10,+8 / MOVE r11,r9 / MOVE r10,r11 | ✓ 短路跳过 rhs |
| x := a OR b | MOVE r10,r8 / JT r10,+8 / ... | ✓ |
## 04_if_elsif_else:分支跳转
| 源码 | 指令 | 结论 |
|---|---|---|
| IF sel=0 THEN out:=10 | MOVE/LOADK(0)/CMP_EQ.I16/JF +16/LOADK(10)/JMP +52 | ✓ |
| ELSIF sel=1 THEN out:=20 | MOVE/LOADK(1)/CMP_EQ/JF/LOADK(20)/JMP +8 | ✓ |
| ELSE out:=30 | LOADK(30) | ✓ |
跳转回填、常量正确 ✓
## 05_while_normalWHILE 回填
| 源码 | 指令 | 结论 |
|---|---|---|
| n := 0 | LOADK.I16 r8, 0 | ✓ |
| WHILE n<10 | MOVE/LOADK(10)/CMP_LT.I16/JF +28 | ✓ |
| n := n+1 | MOVE/LOADK(1)/ADD.I16 r8 | ✓ |
| 回跳 | JMP -56 | ✓ |
## 07_int_arith:算术 func
| 源码 | 指令 | 结论 |
|---|---|---|
| a := 7*6 | LOADK(7)/LOADK(6)/MUL.I16 r8 | ✓ |
| b := a/4 | MOVE/LOADK(4)/DIV.I16 r9 | ✓ |
| c := a-b | MOVE/MOVE/SUB.I16 r10 | ✓ |
| eq := c>30 | MOVE/LOADK(30)/CMP_GT.I16 | ✓ |
## 08_time_literalTIME 字面量
| 源码 | 指令 | 结论 |
|---|---|---|
| t1 := T#10ms | LOADK.I64 r8, 0(常量 10 | ✓ |
| t2 := T#1s250ms | LOADK.I64 r9, 1(常量 1250 | ✓ |
## 09_gvl_external:全局 + 初值
| 项 | 值 | 结论 |
|---|---|---|
| G1 槽 | slot=0 off=0 type=int func=3 | ✓ |
| G1 初值 | 值段 `05 00`5 小端) | ✓ |
| x := G1 | LOAD.I16 r8, s0 | ✓ |
## 13_function_call:调用约定 + max_stack
| 源码 | 指令 | 结论 |
|---|---|---|
| Add: a+b | MOVE r8,r1 / MOVE r9,r2 / ADD.I16 r0 | ✓ r0 结果 |
| x := Add(3,4) | LOADK(3)/LOADK(4)/MOVE r1/MOVE r2/CALL 0/MOVE r8,r0 | ✓ 实参 r1..r7 |
| max_stack | 192 = (12+11×8) + (12+10×8) | ✓ 编译期 DAG |
| 映射 | add: a=r1 b=r2 result=r0main: x=r8 | ✓ |
## 15_fb_instance:用户 FB 共享体(函数化)
| 源码 | 指令 | 结论 |
|---|---|---|
| starter(start:=TRUE,...) | LOADK(TRUE)/STORE_OFF r9,s0,0LOADK(FALSE)/STORE_OFF r10,s0,1 → LOADK.U32 r1,1 → CALL 0 | ✓ 实参绝对槽 + r1 实例指针 |
| Q := start AND NOT stop | fn0(共享体):LOAD_PTR.U8 r8,r1,0 / JF / LOAD_PTR.U8 r10,r1,1 / NOT / MOVE / STORE_PTR.U8 r8,r1,2 | ✓ 基址寻址+短路 |
| q := starter.Q | LOAD_OFF r8, s0, 2 | ✓ 输出读绝对槽 |
值段 3B、映射 start@0 stop@1 q@2 ✓;fn0 单函数体服务所有实例 ✓
## 17_ton:内建 TON
| 源码 | 指令 | 结论 |
|---|---|---|
| t(in:=TRUE, pt:=T#30ms) | STORE_OFF.U8 s0,0STORE_OFF.I64 s0,8 | ✓ pt=TIME→I64 |
| 调用 | CAL.TON s0 | ✓ fb 名显示 |
| q := t.Q | LOAD_OFF.U8 s0,16 | ✓ 偏移 16 |
值段 32Bin@0/pt@8/q@16/et@24)✓
## 18_tof_ctu:双实例 + 字段偏移
| 源码 | 指令 | 结论 |
|---|---|---|
| tf(in:=FALSE, pt:=T#20ms) | STORE_OFF s0,0/8CAL.TOF s0LOAD_OFF s0,16 | ✓ |
| c(cu:=TRUE,r:=FALSE,pv:=3) | STORE_OFF s1,0/1STORE_OFF.I16 s1,2CAL.CTU s1 | ✓ pv=INT 2B |
| q2 := c.Q / cnt := c.CV | LOAD_OFF.U8 s1,4LOAD_OFF.I16 s1,6 | ✓ q@4 cv@6 |
槽表 2 条(addr 0/32)、值段 40B ✓
## 20_line1:全链路
| 源码 | 指令 | 结论 |
|---|---|---|
| starter(start:=I0_0, stop:=I0_1) | LOAD.U8 r8,s1 → STORE_OFF s4,0LOAD.U8 r9,s2 → STORE_OFF s4,1 → LOADK.U32 r1 → CALL 0 | ✓ I 读 + 共享体调用 |
| Q := start AND NOT stop AND NOT EmergencyStop | fn0LOAD_PTR r1,0/JF/LOAD_PTR r1,1/NOT/MOVE/JF/LOAD s0(急停)/NOT/MOVE/STORE_PTR r1,2 | ✓ 基址+双短路+全局 |
| Q0_0 := starter.Q | LOAD_OFF s4,2 / STORE.U8 r8,s3 | ✓ Q 写 |
槽表 5 条(addr 0..4)、值段 7B ✓
## 结构自检(stbcheck13 用例)
寄存器越界 / func 非法 / 跳转越界 / 槽号越界 / 指令长度越界:**全部通过**。
## 结论
- 编译器生成正确性:**13 正例全部对照通过**
- 结构自检:**全部通过**
- 已知缺陷(已修,阶段5-1):LREAL 字面量按目标 func 装载(LREAL → LOADK.F64REAL → LOADK.F32);实测位模式 0x3FC00000float 1.5/ 0x4004000000000000double 2.5)精确