**交互式 x86 与 x86-64 汇编模拟器和实验室。一个完全基于浏览器的从零开始学习汇编的环境——包含单步执行的 32 位模拟器、交互式 64 位演练场、带嵌套帧追踪的可视化栈演练场、寄存器问答游戏、28 个教程章节以及 7 个交互式工具。无后端,无构建步骤,无依赖。**
[](LICENSE)
[](https://github.com/Real-Fruit-Snacks/x86-x64-assembly-lab/releases)
[](https://real-fruit-snacks.github.io/x86-x64-assembly-lab/)
[在线演示](https://real-fruit-snacks.github.io/x86-x64-assembly-lab/) · [更新日志](CHANGELOG.md) · [报告问题](https://github.com/Real-Fruit-Snacks/x86-x64-assembly-lab/issues)
## 概述
一个自包含的汇编教室。将任何 x86 代码清单粘贴到沙盒中并单步执行——寄存器、标志位、按字节寻址的内存和栈会实时更新,并提供 DEC/HEX/BIN 显示。沙盒可以读取真实的反汇编器表示法:段前缀(`ss:[ebp-4]`)、纯十六进制地址(`004940d8`)、`dword ptr` 大小提示,以及 IDA 风格的 `var_N`/`arg_N`。
一个独立的 **64 位引擎**为交互式 x64 演练场提供动力:通过操作按钮(push/pop、call/return、prologue/alloc/leave 以及自由格式执行)驱动一台真正的 `RAX`–`R15` 机器,并具备实时的调用链、撤销功能和场景。因为它是真正的 64 位(基于 `BigInt` 构建),所以真实的规则依然适用——像 `mov eax, 1` 这样的 32 位写入会将 `RAX` 的高半部分清零。
栈演练场包含四种模式(探索、单步执行、解谜、错误),并使用带颜色的边框以及 `main → caller → current` 调用链概览来追踪嵌套帧。寄存器问答游戏可生成涵盖三个难度级别的随机题目,并具备评分、连胜和最佳记录记忆功能。28 个教程章节涵盖了从基础到高级的主题——调用约定、struct、浮点数、动态内存、阅读真实的反汇编代码、XOR 去混淆、keygen 逆向顶点项目、缓冲区溢出以及 x64 差异——每一章都配有微型模拟器和练习挑战。
## 核心功能
- **32 位模拟器:** EAX–EDZ 及其子寄存器 (AL/AH/AX) · ESI · EDI · EBP · ESP · ZF/CF/SF/OF。
- **64 位模拟器:** RAX–RDX/RSI/RDI/RBP/RSP + R8–R15,包含 32/16/8 位子寄存器 · BigInt 精确计算 · 32 位写入清零高半部分。
- **全面的指令集:** MOV(SX/ZX)、算术、按位、移位/循环移位、MUL/IMUL/DIV/IDIV、CBW/CWD/CWDE/CDQ、栈/分支/call/ret。
- **深入教程:** **28 个章节**,包含 39 个交互式微型模拟器和前后对比快照。
- **工具:** 7 个交互式实用工具,包括指令参考、数字/按位/字节序转换器、ASCII 表、标志计算器和地址计算器。
- **栈模式:** 探索、单步执行、解谜和错误模式,用于可视化学习调用栈。
- **x64 演练场:** 按钮驱动的操作、5 个场景、实时调用链追踪、撤销历史和自由格式执行。
- **终端工作台主题:** 石墨色表面、克制的 ANSI 风格装饰和等宽字体部分标签,强制要求 **深色 + 浅色模式** 以及持久的页眉切换按钮。
- **纯前端技术栈:** 原生 HTML/CSS/JS,绝对没有框架、构建步骤、依赖项,也没有 CDN——完全离线运行。
## 快速入门 / 安装说明
只需在浏览器中打开 `index.html` 即可运行本实验室。
```
git clone https://github.com/Real-Fruit-Snacks/x86-x64-assembly-lab.git
cd x86-x64-assembly-lab
# 选项 1 — 直接打开
open index.html
# 选项 2 — 本地服务器
python -m http.server 3456
# -> http://localhost:3456
# 选项 3 — Node
npx serve . -l 3456
```
## 用法
以下是一些关于如何与引擎交互的快速参考规范。
### 支持的输入格式
- **十进制:** `mov eax, 42` / `mov eax, -5`
- **十六进制 (0x):** `mov eax, 0xFF` / `mov eax, -0xFF`
- **十六进制 (IDA):** `mov eax, 0FFh` / `mov eax, 0Ch`
- **十六进制 (地址):** `mov eax, [004940d8]`
- **二进制:** `mov al, 0b11001100` / `mov al, 11001100b`
- **字符:** `mov al, 'A'`
- **IDA 变量:** `mov eax, [ebp+var_4]` / `mov eax, [ebp+arg_0]`
- **内存提示:** `mov dword ptr [ebp-8], 45`
- **段前缀:** `mov edx, dword ptr ss:[ebp-4]`
- **标签地址:** `lea eax, [case0]`(标签解析为代码地址)
- **跳转表:** `jtable: dd case0, case1, case2` + `jmp [jtable + eax*4]`
## 架构 / 文件结构
```
.
index.html Single-page app with 40 sections
tokens.css Terminal Workbench design tokens (dark + light)
style.css App styles, built on the design tokens
simulator.js 32-bit x86 engine: registers, flags, memory, stack, branches
app.js 32-bit UI: sandbox, stack playground, quiz, mini-sims, tools
simulator64.js 64-bit x86-64 engine (BigInt): RAX-R15, sub-registers, flags, stack
app64.js x64 Playground UI: button-driven actions, scenarios, undo, call-chain
docs/assets/ Dark + light logo SVGs
```
**关键模式:** 无框架。每个模拟器引擎都是一个从 `(state, instruction)` 到 `state` 的纯函数,这使得单步执行、演练场、解谜和问答在每个引擎上共享同一个唯一真相源。每个示例、演练、微型模拟和问答轮次都运行在同一个引擎上。64 位引擎是刻意分开的(`simulator64.js` / `app64.js`),因此 64 位的工作不会给 32 位实验室带来任何回归风险,同时保持了无构建、无依赖的模型。
## 贡献指南
我们欢迎您的贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 获取有关如何帮助改进项目的指南。同时请务必查阅我们的 [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)。
## 许可证
本项目基于 [MIT 许可证](LICENSE) 授权。