一个基于 Web 的交互式 8086 汇编语言模拟器,提供实时可视化执行环境。完全在浏览器中运行,无需安装任何软件,让您轻松学习和实践 8086 汇编语言。
- 🎮 交互式编辑器 - 实时语法高亮、代码提示和自动补全
- 🔍 可视化执行 - 实时查看寄存器、标志位和内存状态
- 🐛 调试功能 - 断点设置、单步执行、变量监视、调用栈追踪
- 📺 虚拟显示器 - 80x25 字符模式彩色显示器,支持 BIOS 视频中断
- 🎹 键盘输入 - 支持实时键盘输入和 DOS 中断功能
- 📚 示例程序 - 内置 6 个经典汇编程序示例
- ⚡ 速度控制 - 6 档可调节执行速度(极慢~光速)
- 💾 文件操作 - 导入/导出 ASM 文件
- 🌙 主题切换 - 支持亮色/暗色主题
- 📱 响应式设计 - 适配桌面和移动设备
- Node.js >= 14.0.0
- npm 或 yarn
# 克隆仓库
git clone https://github.com/chizukuo/asmplay.git
cd asmplay
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 访问地址
# 开发服务器默认运行在 http://localhost:5173# 构建生产版本
npm run build
# 预览生产构建
npm run preview- 编写代码 - 在左侧编辑器中输入 8086 汇编代码
- 加载示例 - 点击"示例"按钮选择预设程序
- 运行程序 - 点击"运行"按钮开始执行
- 单步调试 - 使用"单步"按钮逐行执行代码
- 设置断点 - 点击行号设置/取消断点
- 查看状态 - 右侧面板实时显示 CPU 状态和内存
- 代码编辑器: 支持语法高亮和代码提示
- 控制按钮: 运行、暂停、单步、重置、速度调节
- 文件操作: 导入/导出 ASM 文件、示例程序
- CPU 状态: 寄存器值、标志位状态
- 内存视图: 查看内存内容(支持十六进制/ASCII)
- 监视窗口: 监视变量和表达式
- 调用栈: 查看子程序调用层次
- 虚拟显示器: 80x25 字符模式彩色显示
- 断点: 点击行号添加断点,程序会在断点处暂停
- 单步执行: 逐条指令执行,观察寄存器和内存变化
- 变量监视: 添加变量名到监视窗口,实时查看其值
- 速度控制: 调整执行速度以便更好地观察程序运行
详细的指令集说明请参阅 INSTRUCTION_SET.md
项目内置了 6 个完整的示例程序,展示不同的编程技巧:
-
综合演示 (default) - 展示基础指令和屏幕控制
- 屏幕背景色设置(青色背景白字)
- 光标定位
- 字符串输出
- 寄存器运算
- 循环演示(输出 1-5)
-
LOOP 测试 (loop_test) - 循环指令功能测试
- LOOP 指令用法
- CX 寄存器作为计数器
- 屏幕定位输出
-
冒泡排序 (bubble_sort) - 数组排序算法演示
- 嵌套循环实现
- 数据比较与交换
- 内存数组操作
- 排序前后对比显示
-
斐波那契数列 (fibonacci) - 递推数列计算
- 数列计算与累加
- 可视化显示(星号图表)
- 绿色背景黄字主题
-
字符串处理 (string_demo) - 字符串反转示例
- 字符串长度计算
- 字符数组操作
- 反向遍历与复制
- 紫色背景白字主题
-
简易计算器 (calculator) - 四则运算演示
- 加减乘除运算
- 多次计算演示
- 结果验证与显示
- 前端框架: React 18
- 构建工具: Vite
- 样式: Tailwind CSS
- 图标: Lucide React
- 语言: JavaScript (ES6+)
asmplay/
├── src/
│ ├── components/ # React 组件
│ │ ├── AutoResizingContainer.jsx # 自适应容器
│ │ ├── CallStack.jsx # 调用栈显示
│ │ ├── ExamplesModal.jsx # 示例程序模态框
│ │ ├── MemoryView.jsx # 内存视图
│ │ ├── Monitor.jsx # 虚拟显示器
│ │ ├── RegisterCard.jsx # 寄存器卡片
│ │ └── WatchWindow.jsx # 监视窗口
│ ├── hooks/
│ │ └── useAssembler.js # 汇编器核心逻辑 Hook
│ ├── utils/
│ │ ├── assembler.js # 指令解析和执行引擎
│ │ ├── cpu.js # CPU 模拟器
│ │ ├── displayUtils.js # 显示工具函数
│ │ ├── highlightLine.jsx # 语法高亮
│ │ ├── interrupts.js # 中断处理
│ │ └── memoryUtils.js # 内存工具函数
│ ├── constants/
│ │ └── index.js # 常量定义(示例程序、颜色等)
│ ├── styles/ # 样式文件
│ ├── App.jsx # 主应用组件
│ ├── main.jsx # 入口文件
│ └── index.css # 全局样式
├── examples/ # 示例程序目录(可选)
├── index.html # HTML 模板
├── package.json # 项目配置和依赖
├── vite.config.js # Vite 构建配置
├── tailwind.config.js # Tailwind CSS 配置
├── postcss.config.js # PostCSS 配置
├── LICENSE # MIT 许可证
├── README.md # 项目文档
├── INSTRUCTION_SET.md # 指令集详细文档
└── TODO.md # 开发计划
- ✅ 语法高亮(指令、寄存器、注释)
- ✅ 代码自动补全
- ✅ 行号显示
- ✅ 当前执行行高亮
- ✅ 断点可视化标记
- ✅ 错误提示
- ✅ 断点设置(点击行号)
- ✅ 单步执行
- ✅ 连续运行/暂停
- ✅ 变量监视窗口
- ✅ 内存查看(十六进制/ASCII)
- ✅ 调用栈追踪
- ✅ 执行速度控制(6档)
- 📊 实时寄存器显示
- 通用寄存器:AX, BX, CX, DX
- 索引寄存器:SI, DI
- 指针寄存器:SP, BP
- 段寄存器:CS, DS, SS, ES
- 🚩 标志位状态(ZF, SF, CF, OF, PF, AF)
- 💾 内存视图(1MB 地址空间)
- 🎮 程序计数器(PC)显示
- 📺 字符显示器(80×25 彩色文本模式)
- 支持 16 色 DOS 调色板
- 光标位置显示
- 字符属性(前景/背景色)
- ⌨️ 键盘输入支持
- 实时按键捕获
- 键盘缓冲区
- 支持 INT 16H 和 INT 21H
- ✅ INT 10H - BIOS 视频服务
- ✅ INT 16H - BIOS 键盘服务
- ✅ INT 21H - DOS 系统调用
- 详细功能请参阅 INSTRUCTION_SET.md
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- chizukuo - GitHub
- 感谢所有贡献者
- 灵感来源于经典的 8086 汇编学习环境
- 基于 8086/8088 处理器指令集设计
- 立即数寻址:
MOV AX, 1234H - 寄存器寻址:
MOV AX, BX - 直接寻址:
MOV AX, [1000H] - 寄存器间接寻址:
MOV AX, [BX]/MOV AX, [SI]/MOV AX, [DI] - 基址变址寻址:
MOV AX, [BX+SI]/MOV AX, [BX+DI] - 相对基址变址寻址:
MOV AX, [BX+SI+100H] - 符号寻址:
MOV AX, VARNAME/MOV AX, OFFSET VARNAME
DATA SEGMENT
; 数据定义
VAR1 DB 10
VAR2 DW 1234H
STR1 DB 'Hello$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
; 初始化数据段
MOV AX, DATA
MOV DS, AX
; 程序代码
; ...
; 程序终止
MOV AH, 4CH
INT 21H
CODE ENDS
END START- DB (Define Byte): 定义字节,8 位
- DW (Define Word): 定义字,16 位
- DD (Define Double Word): 定义双字,32 位
- DUP: 重复定义操作符,如
BUFFER DB 100 DUP(0)
- ❌ 不支持浮点运算指令(FPU 指令集)
- ❌ 不支持字符串指令(MOVS, CMPS, SCAS, LODS, STOS)
- ❌ 不支持部分高级中断功能
- ❌ 不支持宏定义(MACRO/ENDM)
- ❌ 不支持过程定义(PROC/ENDP,但支持 CALL/RET)
- ❌ 不支持模块化编程(PUBLIC/EXTERN)
⚠️ 内存空间为 1MB(实际 8086 为 1MB)⚠️ 部分中断功能为模拟实现
如需完整的 8086 开发环境,推荐使用 DOSBox + MASM 或 emu8086。
- ✅ 检查代码段是否以
END START结尾 - ✅ 确保标签定义使用冒号(如
LABEL:) - ✅ 验证数据段和代码段正确闭合(SEGMENT/ENDS 成对出现)
- ✅ 检查是否正确初始化数据段寄存器 DS
- ✅ 确保字符串以
$结尾(用于 INT 21H, AH=09H) - ✅ 检查 INT 21H 功能号是否正确
- AH=02H:输出单个字符(DL 中的字符)
- AH=09H:输出字符串(DS:DX 指向字符串)
- ✅ 验证数据段寄存器 DS 已正确初始化
- ✅ 检查 INT 10H 的参数设置(光标位置、颜色属性)
- ✅ 检查数组索引是否越界
- ✅ 确保变量在 DATA SEGMENT 中已定义
- ✅ 验证寻址方式语法正确
- ✅ 检查段寄存器是否正确设置
- ✅ 确保 CX 寄存器初始化为正确的循环次数
- ✅ 检查 LOOP 指令的跳转目标是否正确
- ✅ 注意 LOOP 指令会自动递减 CX
- ✅ 嵌套循环时注意保存/恢复 CX(使用 PUSH/POP)
- ✅ 断点设置在可执行指令行(非注释、空行、标签行)
- ✅ 使用单步执行观察寄存器变化
- ✅ 添加变量到监视窗口查看实时值
- ✅ 查看调用栈追踪子程序调用关系
如有问题或建议,欢迎通过以下方式联系:
- 📧 邮件: chizukuo@icloud.com
- 🐛 问题反馈: GitHub Issues
- 💡 功能建议: GitHub Discussions
推荐的 8086 汇编学习资源:
Note: 此项目仅用于教育和学习目的,是一个轻量级的 8086 汇编模拟器。
🌟 如果这个项目对你有帮助,请给个 Star!