Skip to content
难度中等(★★)
建议时长60分钟
本课难点
  • 立即寻址(放数)与直接寻址(放地址)的高频混淆点
  • 间接寻址“地址的地址”带来的两次访存理解
  • 寄存器寻址 vs 寄存器间接(寄存器里放数 vs 放地址)

1.4 寻址方式

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

本节导学

寻址方式回答的不是“这条指令做什么”,而是“这条指令到哪里找操作数”。字幕里强调,机器指令本质是一串有意义的二进制,通常可抽象成“操作码 + 地址码”。操作码说明加法、取数、跳转等动作;地址码字段说明参与操作的数据在哪里,或者数据本身是什么。

这一节最容易混的是立即寻址和直接寻址:立即寻址放的是操作数本身,直接寻址放的是操作数地址。把这句话记牢,大多数基础题就能解。

指令字段与寻址入口

寻址方式指令中放的是什么关键判断
立即寻址操作数本身,也叫立即数放“数”
直接寻址操作数的直接地址放“地址”
间接寻址操作数地址的地址需要两次寻找
寄存器寻址寄存器编号,寄存器里是操作数寄存器里放“数”
寄存器间接寻址寄存器编号,寄存器里是操作数地址寄存器里放“地址”

机器指令通常包含:

  • 操作码(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速度快

做题路线

  1. 只盯地址字段含义:是数、地址、地址的地址,还是寄存器编号。
  2. 题干说“直接指出操作数本身”就是立即寻址。
  3. 题干说“指出操作数地址”就是直接寻址。
  4. 题干说“指向的单元里存放的仍是地址”就是间接寻址。
  5. 寄存器题看寄存器里放什么:放数是寄存器寻址,放地址是寄存器间接寻址。
  6. CISC/RISC 对比中,寻址方式多样通常偏 CISC;寄存器为主、load/store 通常偏 RISC。

🧪 例题(按难度)

简单(3题)

单选
在“立即寻址”中,若不考虑取指本身,获取操作数需要访问主存的次数为:
单选
若题干强调“需要两次访存才能得到操作数”,最可能的寻址方式是:
单选
指令给出寄存器编号,且寄存器中存放的是“操作数本身”,这种方式是:

中级(3题)

例题1(最经典的描述题)

机器指令的地址字段中直接指出操作数本身的寻址方式是:

单选
选择正确寻址方式:

例题2(直接 vs 间接)

若指令地址字段给出的是操作数的间接地址(需要两次寻址才能得到操作数),则属于:

单选
选择正确寻址方式:

例题3(寄存器 vs 寄存器间接)

若指令中给出寄存器 R1,且 R1 中存放的是操作数地址,则属于:

单选
选择正确寻址方式:

困难(1题)

填空
已知:`M[100]=200`,`M[200]=5`。某指令采用 **间接寻址**,其地址字段为 100,则该指令的操作数值为:

📚 本课小结

  • 立即:指令里放数
  • 直接:指令里放地址
  • 间接:指令里放“地址的地址”
  • 寄存器:寄存器里放数
  • 寄存器间接:寄存器里放地址