1.4 寻址方式
本节导学
寻址方式回答的不是“这条指令做什么”,而是“这条指令到哪里找操作数”。字幕里强调,机器指令本质是一串有意义的二进制,通常可抽象成“操作码 + 地址码”。操作码说明加法、取数、跳转等动作;地址码字段说明参与操作的数据在哪里,或者数据本身是什么。
这一节最容易混的是立即寻址和直接寻址:立即寻址放的是操作数本身,直接寻址放的是操作数地址。把这句话记牢,大多数基础题就能解。
指令字段与寻址入口
| 寻址方式 | 指令中放的是什么 | 关键判断 |
|---|---|---|
| 立即寻址 | 操作数本身,也叫立即数 | 放“数” |
| 直接寻址 | 操作数的直接地址 | 放“地址” |
| 间接寻址 | 操作数地址的地址 | 需要两次寻找 |
| 寄存器寻址 | 寄存器编号,寄存器里是操作数 | 寄存器里放“数” |
| 寄存器间接寻址 | 寄存器编号,寄存器里是操作数地址 | 寄存器里放“地址” |
机器指令通常包含:
- 操作码(OP):做什么(加/减/取数/跳转...)
- 地址码字段:操作数本身或操作数地址
一条指令可有 0/1/2/3 地址(零地址/单地址/双地址/三地址)。软设更关注“地址字段含义”。
五种常见寻址方式
| 寻址方式 | 指令中放什么 | 访存次数(概念理解) | 特点关键词 |
|---|---|---|---|
| 立即寻址(Immediate) | 操作数本身 | 0 | 速度快、灵活性差(改常量要改指令) |
| 直接寻址(Direct) | 操作数的直接地址 | 1 | 简单直观 |
| 间接寻址(Indirect) | 操作数的间接地址(指向一个单元,该单元里放真正地址) | 2 | 灵活性强,但慢 |
| 寄存器寻址(Register) | 寄存器编号(寄存器里放操作数) | 0(不访存) | 快,常见于 RISC |
| 寄存器间接(Register Indirect) | 寄存器编号(寄存器里放操作数地址) | 1 | 折中、常用于指针 |
不同寻址方式在速度、灵活性和指令长度上有取舍。立即寻址最快但常量固定;间接寻址灵活但多一次访问;寄存器方式快,适合频繁操作。
为什么会有多种寻址方式
如果把操作数直接放进指令,CPU 取到指令就能得到数据,速度快,但常量被写死,修改数据就要改程序本身。这就是立即寻址的优势和缺点。
如果把地址放进指令,数据可以存在内存中,修改数据只需改内存单元,不必改指令。直接寻址简单但依赖固定地址;间接寻址再多一层“地址的地址”,灵活性更强,但访问路径更长。
寄存器寻址则把常用数据放进 CPU 内部寄存器,速度远快于访存。RISC 架构偏好寄存器操作,就是为了减少访问主存的次数,便于流水线稳定执行。
记住一条主线:立即是“数”,直接是“地址”,间接是“地址的地址”;寄存器寻址看寄存器里放的是数还是地址。
隐含寻址
有些指令默认使用某个操作数寄存器,例如累加寄存器 AC,指令里不显式写出操作数位置,这称为隐含寻址。
隐含寻址可以减少指令长度,但灵活性较弱,因为操作数位置被指令格式默认固定。
遇到题干说“操作数由指令隐含指定”或“默认使用 AC”等描述,就判断为隐含寻址。
高频对比表
| 寻址方式 | 地址字段含义 | 访存次数 | 典型关键词 |
|---|---|---|---|
| 立即寻址 | 操作数本身 | 0 | 常量、立即数 |
| 直接寻址 | 操作数地址 | 1 | 给地址 |
| 间接寻址 | 地址的地址 | 2+ | 多一次间接 |
| 寄存器/寄存器间接 | 寄存器编号/寄存器中地址 | 0 或 1 | 速度快 |
做题路线
- 只盯地址字段含义:是数、地址、地址的地址,还是寄存器编号。
- 题干说“直接指出操作数本身”就是立即寻址。
- 题干说“指出操作数地址”就是直接寻址。
- 题干说“指向的单元里存放的仍是地址”就是间接寻址。
- 寄存器题看寄存器里放什么:放数是寄存器寻址,放地址是寄存器间接寻址。
- CISC/RISC 对比中,寻址方式多样通常偏 CISC;寄存器为主、load/store 通常偏 RISC。
🧪 例题(按难度)
简单(3题)
中级(3题)
例题1(最经典的描述题)
机器指令的地址字段中直接指出操作数本身的寻址方式是:
例题2(直接 vs 间接)
若指令地址字段给出的是操作数的间接地址(需要两次寻址才能得到操作数),则属于:
例题3(寄存器 vs 寄存器间接)
若指令中给出寄存器 R1,且 R1 中存放的是操作数地址,则属于:
困难(1题)
📚 本课小结
- 立即:指令里放数
- 直接:指令里放地址
- 间接:指令里放“地址的地址”
- 寄存器:寄存器里放数
- 寄存器间接:寄存器里放地址