汇编基础教程

汇编是唯一能真正”直接操作硬件”的编程语言。C 语言被称为”可移植汇编”,但有一些操作 C 根本做不到——特权指令(in/out、cli/sti、rdmsr/wrmsr)只能由汇编发出、裸机第一行代码只能是汇编、中断入口只能是汇编。本教程立足 RootStack 体系的底层视角,为你揭开从键盘、串口、显存到 CPU 控制寄存器的全部硬件操控秘密。

本教程假设你已有 C 或 C++ 基础,了解 C++ 变量与类型 和基本的 计算机组成原理 概念。


教程结构

汇编基础/
├── 汇编目录.md <-- 你在这里
├── 1基础/ (4篇) 语言基础: 寄存器/指令/调用约定/调试工具
│ ├── 01_寄存器与指令基础.md
│ ├── 02_栈与调用约定.md
│ ├── 03_C++在汇编层的体现.md
│ └── 04_工具链与调试环境.md
├── 2硬件操作/ (11篇) 核心: 如何用汇编直接操作硬件
│ ├── 00_硬件操作总览.md 特权级/权限表/两条访硬路径地图/实验环境
│ ├── 01_Port_IO与MMIO.md in/out 指令、MMIO 访存=设备、x86 端口空间
│ ├── 02_特权级与系统寄存器.md Ring0-3、CR0-CR4、CPUID、MSR、全局描述符表
│ ├── 03_内联汇编精通.md GCC asm 完备约束、clobber、内存屏障、原子指令
│ ├── 04_中断与IDT.md IDT/PIC 8259 编程/ISR 全汇编写法/iret
│ ├── 05_串口UART实战.md 16550 端口编程 → 裸机 Hello World(QEMU 可跑)
│ ├── 06_VGA文本模式实战.md 0xB8000 写显存、滚屏、光标控制
│ ├── 07_定时器PIT实战.md 8254 端口编程 → sleep/时钟、RTC
│ ├── 08_键盘输入实战.md PS/2 8042、扫描码、中断驱动 vs 轮询
│ ├── 09_引导启动实机汇编.md 上电入口→实模式→GDT→保护模式→长模式→进入 kernel
│ └── 10_ARM汇编与硬件访问.md ARM/LDR-STR/树莓派 GPIO 真机 MMIO/与 x86 对照
└── 3ARM/ (预留, ARM 内容扩充后拆分)

推荐学习路径

阶段一:汇编语言基础(1 周)

顺序文件重点
101 寄存器与指令x86-64 寄存器、mov/lea/add/sub/cmp/jmp、寻址模式
202 栈与调用约定push/pop、call/ret、System V AMD64 ABI、调用者/被调用者保存
304 工具链NASM 安装、ld 链接、objdump 反汇编、gdb layout asm、QEMU
403 C++ 汇编实现this 指针、vtable、构造函数/析构、名称修饰(按需阅读)

此时你已经能阅读 gcc -S 生成的汇编和 objdump 的反汇编输出。

阶段二:硬件操作入门(1-2 周)

顺序文件重点
500 硬件操作总览汇编为何能直接操作硬件、两条访硬路径、实验环境搭建
6O 与 MMIOin/out 指令、64K 端口空间、MMIO = mov 访存即设备
702 特权级与寄存器Ring0-3、CR0-CR4、CPUID 查 CPU 能做什么、MSR
803 内联汇编精通在 C 中直接操作硬件的钥匙——完整约束/内存屏障/原子操作
904 中断与 IDT硬件如何通知 CPU:IDT、PIC 8259、ISR、iret

阶段三:实战硬件操作(按需,每项 1-2 天)

顺序文件实战设备可跑环境
1005 串口 UART16550 UARTQEMU -serial stdio
1106 VGA 文本模式VGA 显存QEMU
1207 定时器 PIT8254 PITQEMU
1308 键盘输入PS/2 8042QEMU
1409 引导启动BIOS/UEFI、实模式、保护模式QEMU 裸机
1510 ARM 汇编与硬件ARM / 树莓派 GPIO真机或 QEMU ARM

x86-64 汇编快速参考

通用寄存器

64位32位16位8位常见用途
raxeaxaxal返回值
rbxebxbxbl被调用者保存
rcxecxcxcl第4参数(Linux)/第1参数(Win)
rdxedxdxdl第3参数(Linux)/第2参数(Win)
rsiesisisil第2参数(Linux)
rdiedididil第1参数(Linux)→C++ this指针
rbpebpbpbpl栈帧基址
rspespspspl栈顶指针
r8~r15r8d~r8w~r8b~通用/第5-6参数(Linux)

NASM ↔ AT&T 语法对照

操作NASM (Intel)AT&T (GCC 风格)
传送mov rax, rbxmovq %rbx, %rax
取内存mov rax, [rdi+8]movq 8(%rdi), %rax
存内存mov [rdi], raxmovq %rax, (%rdi)
立即数mov eax, 42movl $42, %eax
加法add rax, 10addq $10, %rax
比较cmp rax, rbxcmpq %rbx, %rax
函数调用call funccall func
返回retret

本教程主力使用 NASM(Intel 语法),关键位置给出 AT&T 对照以衔接 C 教程的内联汇编章节


与其他模块的关联

模块入口关系
C 语言教程[[../c语言教程/c目录C 教程目录]]
C++ 教程[[../cpp教程/cpp目录C++ 教程目录]]
计算机原理[[../计算机原理/计算机原理_索引计算机原理索引]]
操作系统[[../操作系统/操作系统_索引操作系统索引]]
内核[[../内核/内核索引内核索引]]
红队 (Linux)[[../red_team/总目录与快速查询红队知识库]]

外部资源