DavidTbilisi/nasm_learn
GitHub: DavidTbilisi/nasm_learn
一个完全在浏览器中运行的交互式 x86 汇编学习环境,通过逐步调试器、演练场和限时训练帮助用户零安装掌握汇编基础。
Stars: 0 | Forks: 0
# NASM 学习
[](https://github.com/DavidTbilisi/nasm_learn/actions/workflows/test.yml)
[](https://github.com/DavidTbilisi/nasm_learn/actions/workflows/deploy.yml)
[](LICENSE)
[](https://davidtbilisi.github.io/nasm_learn/)
一个完全在浏览器中运行的交互式 x86 汇编学习环境 —— 无需安装。
**[在线演示 →](https://davidtbilisi.github.io/nasm_learn/)**

*荧光绿复古终端 —— 带有实时寄存器/标志/栈状态的引导式课程*
## 适用人群
- **CS 学生**:正在上汇编语言课程,想要一个沙盒在课余时间练习示例。
- **渗透测试学习者**:正在准备 HTB / TryHackMe / OSCP,需要流畅地阅读反汇编代码。
- **CTF 选手**:在 pwn / 逆向工程赛道上,经常在栈帧和调用约定处遇到瓶颈。
- **嵌入式系统 / 固件开发者**:经常阅读编译器输出,希望建立更快的思维模型。
- **复古游戏 / Demo 爱好者**(NES, C64, Atari):想要一个现代化的单步调试器来原型化例程。
## 12 节课后你能做什么
- 阅读反汇编的 C 输出并跟踪控制流。
- 在真实的 Linux 二进制文件上使用 GDB+GEF 设置断点并单步调试。
- 在 shellcode payload 中发现字节序错误。
- 一眼识别栈帧序言 / 结语。
- 在反汇编代码中识别 SysV AMD64 调用约定。
- 无需运行代码即可通过指令链预测寄存器状态。
- 编写一个小型 NASM 程序,在 Linux 上通过 `syscall` 打印到 stdout。
- 凭记忆在纸上勾勒出缓冲区溢出场景。
## 演示

*逐条单步执行指令 —— 实时观察寄存器、标志和栈的更新*
## 工具如何帮助你达成目标
- **12 节引导式课程**,涵盖寄存器、算术、标志、内存、栈、循环、函数、字符串、数组、位操作和系统调用。
- **逐步调试器** —— 运行、向前/向后单步执行指令,实时查看寄存器、标志和栈的更新。
- **演练场** —— 自由格式的编辑器,可编写和调试任何你喜欢的汇编代码,内置 6 个代码片段和自动保存功能。
- **测验模式** —— 选择题和填空题,提供即时反馈和进度条。
- **训练模式** —— 跨越 7 个主题类别的限时训练,在压力下建立熟练度。
- **3 种主题** —— 复古(荧光绿 CRT)、赛博朋克(霓虹黑色)、学术(暖象牙色,最大可读性)。
- **可调整大小的面板** —— 拖动手柄以重排布局;双击任何手柄重置;通过 `localStorage` 持久化。
- 带有 NASM 语法高亮的 **CodeMirror 编辑器**。
## 截图
### 调试器 —— 单步执行指令

### 演练场 —— 自由编写,运行任何代码

### 测验模式

### 训练模式 —— 限时训练

### 主题
| 赛博朋克 | 学术 |
|-----------|----------|
|  |  |
## 本地运行
```
npx serve tutorial
```
## 模拟器
JavaScript 模拟器 (`tutorial/simulator.js`) 实现了 x86 的一个子集:
| 类别 | 指令 |
|---|---|
| 数据传送 | `mov`, `xchg`, `lea`, `push`, `pop` |
| 算术 | `add`, `sub`, `mul`, `imul`, `div`, `idiv`, `inc`, `dec`, `neg` |
| 逻辑 | `and`, `or`, `xor`, `not`, `shl`, `shr`, `sar` |
| 比较 | `cmp`, `test` |
| 跳转 | `jmp`, `je/jz`, `jne/jnz`, `jl/jnge`, `jle/jng`, `jg/jnle`, `jge/jnl`, `jb`, `jbe`, `ja`, `jae`, `js`, `jns` |
| 函数 | `call`, `ret` |
| 输出 | `int 0x80` (Linux write/exit syscalls) |
寄存器:`eax ebx ecx edx esi edi esp ebp`
标志:`ZF CF SF OF DF`
## 在本地构建 NASM 程序
### Windows (Win32 PE32) — `main.asm`
```
nasm -f win32 main.asm -o main.o
ld main.o -o main -lkernel32
./main
```
### Linux (x86-64 ELF) — `examples/linux-hello.asm`
```
nasm -f elf64 examples/linux-hello.asm -o linux-hello.o
ld linux-hello.o -o linux-hello
./linux-hello
```
Linux 示例直接调用内核 —— 不使用 libc —— 使用 `sys_write` (syscall 1) 和 `sys_exit` (syscall 60)。
### macOS (x86-64 Mach-O) — `examples/macos-hello.asm`
```
nasm -f macho64 examples/macos-hello.asm -o macos-hello.o
ld -macos_version_min 10.13 -lSystem -o macos-hello macos-hello.o
./macos-hello
```
在 macOS 上,syscall 号与 BSD 类 `0x2000000` 进行了按位或运算,入口点是 `_main`,并且 `ld` 需要 `-lSystem` 以及最低版本标志。Mach-O 节名与 ELF 不同(例如 `__TEXT`, `__DATA`),但 NASM 的 `macho64` 目标会处理转换。
## 测试
[Playwright](https://playwright.dev/) 端到端测试套件 —— 54 个测试,涵盖页面加载、标签页导航、模拟器运行/单步/重置、调整大小手柄、测验和训练。
```
npm install
npx playwright install chromium
npm test
```
要按名称运行单个测试:
```
npx playwright test --grep "error banner"
```
CI 在每次推送和 PR 时通过 [`.github/workflows/test.yml`](.github/workflows/test.yml) 运行完整套件。
## Neural OS 库的一部分
本仓库是一系列小型、专注的学习资源之一:
- [memory-palace-lab](https://github.com/DavidTbilisi/memory-palace-lab) — 学院旗舰产品
- [SorobanMachine](https://github.com/DavidTbilisi/SorobanMachine) — 心算训练
- [learn_linux](https://github.com/DavidTbilisi/davidtbilisi.learn_linux) — Linux 基础
- [learning_git](https://github.com/DavidTbilisi/davidtbilisi.learning_git) — 从零开始学习 Git
- [cheatsheets-ka](https://github.com/DavidTbilisi/cheatsheets-ka) — 快速参考手册
- [IT-Dictionary](https://github.com/DavidTbilisi/IT-Dictionary) — 术语参考
## 许可证
[ISC](LICENSE) — 请参阅仓库根目录下的 `LICENSE` 文件。
标签:DNS 反向解析, IP 地址批量处理, NASM, Pwn, Shellcode, x86, 云资产清单, 在线调试器, 快速连接, 技术调研, 数据可视化, 汇编语言, 浏览器端, 特征检测, 系统底层, 缓冲区溢出, 网络安全, 自定义脚本, 计算机科学教育, 调试辅助, 逆向工程, 隐私保护