翻译流水线

VML 汇编 → 目标汇编 → 目标机器码,四阶段流程

输入
VML 汇编 (.vml) / VMB 二进制 (.vmb)
↓ 阶段 1: VML 指令解析 ↓
中间
IR 指令序列寄存器分配
↓ 阶段 2: 指令映射 + 寄存器映射 ↓
中间
目标汇编指令标签解析
↓ 阶段 3: 汇编生成 ↓
输出
目标汇编 (.s / .asm)
↓ 阶段 4: VMLToHex 最终输出 ↓
烧录
HEXBINELFS19

所有架构总览

65028-bitApple II / C64 / NES
Z808-bitCP/M / ZX Spectrum / MSX
80518-bit嵌入式 MCU 经典
AVR8-bitArduino / ATmega328P
PIC8-bitMicrochip PIC16F84A
MSP43016-bitTi 超低功耗
PIC2416-bitMicrochip 16位
ARM-CM32-bitSTM32 / Cortex-M
x8632-bitIBM PC / 通用计算
MIPS32-bitPIC32 / 网络设备
RISC-V32-bitSiFive / 开源 ISA
6800032-bitAmiga / Atari ST
PowerPC32-bitXilinx PPC405 / 游戏机
SPARC32-bitLEON3 / 航天级
JVMVMJava 字节码
.NETVMCLR / CIL 平台
WasmVM浏览器 / WebAssembly

VML → 目标架构 寄存器映射

VML 16 个通用寄存器 (R0-R15) + 8 个浮点寄存器 (F0-F7) 如何映射到各架构

架构R0-R3R4-R11R12 (BP)R13 (SP)R14R15 (RA)浮点
VML (虚拟)R0-R3R4-R11R12R13R14R15F0-F7
6502ZP $00-$03ZP $04-$0BZP $0C-$0DSP $01FF-ZP $0E-$0F栈软件模拟
Z80BC/DEHL/IX/IYIX+0SPIY栈软件模拟
8051R0-R3 (B0)R4-R7 (B0)XRAMSPXRAM栈软件模拟
AVRR16-R19R20-R27R28-R29 (Y)SPH:SPLR30-R31 (Z)栈软件模拟
PIC文件寄存器文件寄存器FSR—FSR栈(硬件)不支持
MSP430R4-R7R8-R11R12R1 (SP)R13R14软件模拟
ARM-CMR0-R3R4-R11R11 (FP)R13 (SP)R12 (IP)R14 (LR)VFP/软件
x86EAX/EBX/ECX/EDXESI/EDI/内存EBPESP内存栈x87 FPU
MIPS$v0/$v1/$a0/$a1$t0-$t7$fp$sp$gp$ra软件模拟
RISC-Va0-a3 (x10-x13)t0-t6 (x5-x7,x28-31)s0 (x8)sp (x2)s1 (x9)ra (x1)F扩展/软件
JVM本地变量0-3本地变量4-11本地变量12操作数栈本地变量13本地变量14FLOAD/FSTORE
.NET本地变量0-3本地变量4-11本地变量12评估栈本地变量13本地变量14LDLOC/STLOC

6502/Z80/PIC 等 8-bit 架构使用零页 (Zero Page) 内存模拟寄存器。ARM-CM 和 RISC-V 可 1:1 直接映射。

ARM Cortex-M 翻译示例 — 最完整映射

ARM-CM 是 1:1 映射最完整的后端,每个 VML 寄存器直接对应一个 ARM 寄存器

VML 代码

; 加法函数
LABEL add
    ADD R0, R1       ; R0 = R0 + R1
    RET

; 主程序
LABEL main
    MOVE R0, #10
    MOVE R1, #20
    CALL add
    SYSCALL #1       ; 打印 R0
    HALT

ARM Thumb-2 输出

@ 加法函数
add:
    add r0, r0, r1   @ R0 = R0 + R1
    bx lr

@ 主程序
main:
    mov r0, #10
    mov r1, #20
    bl add
    bl syscall_1     @ 打印 R0
    b halt

ARM-CM 映射亮点

  • R0-R12 → ARM r0-r12 (100% 寄存器对应)
  • R13 → SP (r13), R14 → r12 (临时), R15 → LR (r14)
  • 所有算术指令 1:1 翻译 (ADD/SUB/MUL 直接映射)
  • VFP 硬件浮点单元支持 F0-F7 直接映射
  • CALL → BL, RET → BX LR, 零开销转换

8 位架构翻译挑战

从 32 位 VML 虚拟寄存器翻译到 8 位 CPU 的软件模拟策略

6502 翻译策略

VML 的 32-bit 寄存器被拆为 4 字节存储在 Zero Page 中。每条 VML 指令需翻译为多条 6502 指令。

; VML: ADD R0, R1
; 6502: 32-bit 加法 (4 字节)
CLC
LDA $00    ; R0 低字节
ADC $04    ; R1 低字节
STA $00
LDA $01    ; R0 字节1
ADC $05    ; R1 字节1
STA $01
; ... 字节2和字节3同理
1 条 VML → ~12 条 6502Zero Page 64 字节

PIC 8-bit 翻译策略

PIC 只有 1 个工作寄存器 (W) 和硬件调用栈 (2-8 级深)。寄存器通过文件寄存器模拟。

; VML: MOVE R0, #42
; PIC: 加载立即数到文件寄存器
MOVLW 0x2A   ; W ← 42
MOVWF 0x20   ; R0_lo ← W
CLRW
MOVWF 0x21   ; R0_hi ← 0
MOVWF 0x22   ; R0_h2 ← 0
MOVWF 0x23   ; R0_h3 ← 0
1 条 VML → ~5 条 PICW 寄存器瓶颈

VMLToHex — 完整烧录工作流

从 VML 源码到 HEX 固件的一站式工具

命令说明
vml2hex main.c -arch avrC 源码 → AVR HEX(全自动)
vml2hex main.bas -arch 8051BASIC 源码 → 8051 HEX
vml2hex main.py -arch arm-cmPython 源码 → STM32 HEX
vml2hex program.vml -arch avr -O2VML → AVR HEX (O2 优化)
vml2hex program.vml -arch avr --bios链接硬件 BIOS (UART 驱动)
vml2hex program.vml -arch avr --no-bios不链接 BIOS (纯裸机)
vml2hex program.vml -arch avr -f elf输出 ELF 格式 (调试用)
vml2hex program.vml -arch arm-cm --chip stm32f429指定芯片型号

优化等级

等级说明适用场景
-O0不优化,保留所有指令调试
-O1死代码消除 + 常量折叠(默认)日常开发
-O2O1 + 复制传播 + 循环优化生产发布

输出格式

格式参数用途
Intel HEX-f hex烧录(默认)
Binary-f bin裸二进制
Motorola S19-f s19Freescale 烧录器
ELF-f elfGDB 调试 / objdump 反汇编
DOS EXE-f exeDOS 可执行文件
Text Dump-f dump人类可读文本