认识 8086
8086 是 Intel 在 1978 年推出的一颗 16 位 CPU。今天你电脑里的 Intel / AMD 处理器,全都是它的后代——它们同属一个"x86"家族,而 8086 正是这个家族名字的由来。
它之所以是绝佳的入门起点,是因为它足够简单:寄存器、内存、指令这些核心概念在 8086 上都以最朴素的形式呈现。学会它,再去看 32 位、64 位,不过是"升级版"而已。
16 位(一次处理 16 位数据)· 20 位地址总线(能寻址 2²⁰ = 1MB)· 1MB 内存空间 · 1978 年诞生。其中"16 位寄存器却要寻址 1MB"这个矛盾,正是后面"段:偏移"寻址的由来。
读前 30 秒 · 先认识 4 个词
计算机的"大脑",负责一条条地执行指令。8086 就是一颗 CPU。
CPU 内部超快的临时存储。计算前,要先把数据从内存搬进寄存器。
内存里每个字节的"门牌号"。"0x"开头只是十六进制写法,当编号看即可。
用接近人话的符号写的 CPU 指令,如 mov(移动)、add(加)。
寄存器
内存虽大,但 CPU 算数、比较时,得先把数据拿到寄存器里——它就在 CPU 内部,速度比内存快几个数量级。8086 的寄存器都是 16 位,按用途分四类:
| 类别 | 寄存器 | 用途 |
|---|---|---|
| 通用寄存器 | AX BX CX DX | 算数、暂存数据;每个都能拆成高 8 位 + 低 8 位(如 AX = AH + AL) |
| 指针 / 变址 | SP BP SI DI | SP 指向栈顶,BP 作栈基址,SI / DI 用于串操作的源 / 目的 |
| 段寄存器 | CS DS SS ES | 配合偏移,拼出内存地址(第 3、4 章详解) |
| 指令指针 | IP | 和 CS 组成 CS:IP,永远指向"下一条要执行的指令" |
| 标志寄存器 | FLAGS | 记录运算结果的标志(如是否为 0、是否进位) |
通用寄存器能"一拆为二"
四个通用寄存器 AX、BX、CX、DX,每个 16 位,都能拆成两个 8 位用:高 8 位叫 H(High),低 8 位叫 L(Low)。以 AX 为例:
AX 累加器(算数常用)· BX 基址(常用来指向数据)· CX 计数器(循环常用)· DX 数据(乘除、I/O 常用)。名字里藏着它们的"老本行"。
内存寻址
这里有个矛盾:8086 要能访问 1MB 内存,需要 20 位地址(2²⁰ = 1MB);可它的寄存器只有 16 位,最大只能表示 64KB。16 位怎么够到 1MB?
8086 的办法很巧妙:用两个 16 位数"拼"。一个叫"段"(segment),一个叫"偏移"(offset),计算时把段左移 4 位(即 × 16)再加偏移:
一举两得:① 用两个 16 位拼出了 20 位地址,够到 1MB;② 天然支持把内存按"段"来组织(下一章),便于管理。试着把段和偏移各改一改,你会发现同一个物理地址可以有多种"段:偏移"写法(如 0x1200:0x0000 也是 0x12000)。
逻辑分段
8086 把内存按用途分成几"段",每段由一个段寄存器"指着"。这样代码、数据、栈各归各位,井井有条。把鼠标移到各段上看详情:
CS:IP 指向"下一条要执行的指令"(下一章的主角);SS:SP 指向"栈顶"。记住这两对,就掌握了 8086 程序运行的命脉。
程序如何运行
CPU 跑程序,就是不断重复一个循环:从 CS:IP 指向的地方取出一条指令 → 执行它 → IP 自动前进到下一条。CS:IP 就是程序运行的"指针",它指到哪,CPU 就执行到哪。
每条指令执行完,IP 就自动指向下一条,寄存器的值随之改变。程序就是这样被 CPU"一条条"跑完的。跳转指令(如 jmp)则是直接改写 IP,让程序跳到别处执行。
自测一下
这 6 道题检验你对 8086 基础的掌握。 尚未作答
8086 是"实模式、直接用物理内存"。接下来计算机会进入"保护模式",引入虚拟内存、分页这些新概念——它们正是读懂现代程序和 DLL 的基础。