寄存器与内存
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 3 课,共 45 课。
现在,你已经了解了计算机中可以存放数据的两个地方:
- 寄存器:CPU 内部的小型存储单元
- 内存(RAM):CPU 外部由编号槽位组成的巨大网格
但是为什么有两个位置?为什么 CPU 不把所有内容都保存在内存中?
答案是速度。寄存器非常快,因为它们位于 CPU 内部。内存比较慢,因为它位于 CPU 外部。CPU 可以在一个周期内访问寄存器,但访问内存需要更长时间。
并排比较:
| 特征 | 寄存器 | 内存(RAM) |
|---|---|---|
| 位置 | CPU 内部 | CPU 外部 |
| 速度 | 极快(1 个周期) | 较慢(多个周期) |
| 存储槽数量 | 很少(x86-64 上有 16-32 个) | 数百万或数十亿个 |
| 每个存储槽的大小 | 8 字节(64 位) | 1 字节 |
| 访问方式 | 按名称(rax、rbx、rcx...) | 按地址(1000、msg、buffer) |
| 易失性? | 是(断电后数据会消失) | 是(断电后数据会消失) |
汇编中最重要的规则:
一条指令最多只能使用一个内存操作数。要合并两个都在内存中的值,先将其中一个加载到寄存器中。
寄存器也是你保存要处理的值的地方,因为每次访问内存都很慢。
你会经常用到的三步模式:
| 步骤 | 发生了什么 | 示例 |
|---|---|---|
| 1. LOAD | 将数据从内存复制到寄存器 | mov rax, [count] |
| 2. WORK | 对寄存器中的数据进行操作 | add rax, 5 |
| 3. STORE | 将结果复制回内存(如果需要) | mov [result], rax |
如果你忘记这条规则,会发生什么?
如果你尝试把两个都在内存中的数字相加,汇编器会报错。CPU 无法完成这个操作。你必须先把其中一个加载到寄存器中。
亲手试试
这节课没有代码挑战。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器