VML 汇编翻译到任意 CPU 架构,支持 HEX 烧录与交叉编译
VML 汇编 → 目标汇编 → 目标机器码,四阶段流程
VML 16 个通用寄存器 (R0-R15) + 8 个浮点寄存器 (F0-F7) 如何映射到各架构
| 架构 | R0-R3 | R4-R11 | R12 (BP) | R13 (SP) | R14 | R15 (RA) | 浮点 |
|---|---|---|---|---|---|---|---|
| VML (虚拟) | R0-R3 | R4-R11 | R12 | R13 | R14 | R15 | F0-F7 |
| 6502 | ZP $00-$03 | ZP $04-$0B | ZP $0C-$0D | SP $01FF- | ZP $0E-$0F | 栈 | 软件模拟 |
| Z80 | BC/DE | HL/IX/IY | IX+0 | SP | IY | 栈 | 软件模拟 |
| 8051 | R0-R3 (B0) | R4-R7 (B0) | XRAM | SP | XRAM | 栈 | 软件模拟 |
| AVR | R16-R19 | R20-R27 | R28-R29 (Y) | SPH:SPL | R30-R31 (Z) | 栈 | 软件模拟 |
| PIC | 文件寄存器 | 文件寄存器 | FSR | — | FSR | 栈(硬件) | 不支持 |
| MSP430 | R4-R7 | R8-R11 | R12 | R1 (SP) | R13 | R14 | 软件模拟 |
| ARM-CM | R0-R3 | R4-R11 | R11 (FP) | R13 (SP) | R12 (IP) | R14 (LR) | VFP/软件 |
| x86 | EAX/EBX/ECX/EDX | ESI/EDI/内存 | EBP | ESP | 内存 | 栈 | x87 FPU |
| MIPS | $v0/$v1/$a0/$a1 | $t0-$t7 | $fp | $sp | $gp | $ra | 软件模拟 |
| RISC-V | a0-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 | 本地变量14 | FLOAD/FSTORE |
| .NET | 本地变量0-3 | 本地变量4-11 | 本地变量12 | 评估栈 | 本地变量13 | 本地变量14 | LDLOC/STLOC |
6502/Z80/PIC 等 8-bit 架构使用零页 (Zero Page) 内存模拟寄存器。ARM-CM 和 RISC-V 可 1:1 直接映射。
ARM-CM 是 1:1 映射最完整的后端,每个 VML 寄存器直接对应一个 ARM 寄存器
; 加法函数
LABEL add
ADD R0, R1 ; R0 = R0 + R1
RET
; 主程序
LABEL main
MOVE R0, #10
MOVE R1, #20
CALL add
SYSCALL #1 ; 打印 R0
HALT
@ 加法函数
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
从 32 位 VML 虚拟寄存器翻译到 8 位 CPU 的软件模拟策略
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同理
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
从 VML 源码到 HEX 固件的一站式工具
| 命令 | 说明 |
|---|---|
vml2hex main.c -arch avr | C 源码 → AVR HEX(全自动) |
vml2hex main.bas -arch 8051 | BASIC 源码 → 8051 HEX |
vml2hex main.py -arch arm-cm | Python 源码 → STM32 HEX |
vml2hex program.vml -arch avr -O2 | VML → 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 | 死代码消除 + 常量折叠(默认) | 日常开发 |
-O2 | O1 + 复制传播 + 循环优化 | 生产发布 |
| 格式 | 参数 | 用途 |
|---|---|---|
| Intel HEX | -f hex | 烧录(默认) |
| Binary | -f bin | 裸二进制 |
| Motorola S19 | -f s19 | Freescale 烧录器 |
| ELF | -f elf | GDB 调试 / objdump 反汇编 |
| DOS EXE | -f exe | DOS 可执行文件 |
| Text Dump | -f dump | 人类可读文本 |