指令如何工作
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 4 课,共 45 课。
你知道 CPU 会逐条执行指令。但 CPU 怎么知道下一条要运行哪条指令?指令存储在哪里?指令实际是什么样的?
指令是数字。
这是关于计算机的一个基本事实。一切都是数字。你处理的数据(比如数字 42)是数字。数据所在的地址(比如 1000)是数字。指令本身(比如 mov、add、cmp)也是数字。
当你编写像 mov rax, 5 这样的汇编代码时,汇编器会将这段人类可读的文本转换成 CPU 能理解的数字。这个数字称为指令代码。
指令存储在哪里?
指令像数据一样存储在内存中。指令没有单独的内存。相同的内存中存储着:
- 数据(数字、字符、数组)
- 指令(程序本身)
字节本身不会说明它们是指令还是数据。CPU 会把程序计数器所指向的内存地址中的内容当作下一条指令。在现代系统中,操作系统会将存放程序指令的内存标记为可执行,CPU 会拒绝运行未以这种方式标记的内存中的字节,例如程序的数据。你在第 0.1 课中简要了解过 PC。现在该准确了解它的工作原理了。
程序计数器(也称为指令指针)是 CPU 内部的一个特殊寄存器。它唯一的作用是保存下一条要执行的指令的内存地址。
取指执行周期:
CPU 会永远重复以下三个步骤:
| 步骤 | 发生了什么 |
|---|---|
| 1. FETCH | 读取 PC 中地址对应的指令 |
| 2. EXECUTE | 执行该指令 |
| 3. ADVANCE | 将 PC 移到下一条指令 |
简单示例:
如果 PC = 1000,CPU 会:
- 获取地址 1000 处的指令
- 执行它
- 将 PC 移动到下一个地址(1000 + 指令大小)
然后,它会使用新的 PC 值重复执行。
指令的形式:
每条指令都有两部分:
| 部分 | 作用 | 示例 |
|---|---|---|
| 操作码 | 要执行什么操作 | mov、add、cmp |
| 操作数 | 对什么执行操作 | rax、5、[result] |
有些指令有一个操作数(例如 inc rax,用于加 1)。有些有两个操作数(例如 mov rax, 5)。有些有三个操作数(例如某些架构中的 add rax, rbx, rcx)。
亲手试试
这节课没有代码挑战。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器