计组-间接寻址

间接寻址(Indirect Addressing)的过程详解

间接寻址是一种通过寄存器或内存单元中存储的地址来访问最终操作数 的寻址方式。其核心思想是"地址的地址",具体步骤如下:


(1)间址周期的操作流程

以指令 ADD R1, (R2) 为例(假设 (R2) 是间接寻址):

  1. 取指令阶段

    • CPU 从 PC(程序计数器)指向的内存位置取出指令 ADD R1, (R2),并解码发现目标操作数是间接寻址。
  2. 间址周期(核心阶段)

    • 步骤 1 :CPU 读取寄存器 R2 中存储的值(假设 R2 = 0x1000),这是一个中间地址

    • 步骤 2 :CPU 访问内存地址 0x1000,读取该地址中存储的最终操作数的地址 (假设 [0x1000] = 0x2000)。

    • 步骤 3 :将最终地址 0x2000 存入 MDR(Memory Data Register,内存数据寄存器),供后续执行阶段使用。

  3. 执行阶段

    • CPU 根据 MDR 中的地址 0x2000 访问内存,读取最终操作数的值(假设 [0x2000] = 42)。

    • 执行加法操作:R1 = R1 + 42


(2)间址周期结束后 MDR 的内容
  • MDR 存放的是从中间地址读出的最终操作数的地址 (如上例中的 0x2000)。

    • 如果是多级间接寻址 (如 ((R2))),MDR 可能存储下一级间接地址,需继续访存。

2. 指令 (MDR) + (R1) → R1 的详细解释

假设当前状态:

  • MDR = 0x2000(存储的是最终操作数的地址)。

  • [0x2000] = 42(内存地址 0x2000 中的值是 42)。

  • R1 = 10(寄存器 R1 的初始值)。

执行过程
  1. 读取 (MDR)

    • (MDR) 表示对 MDR 中的值 0x2000 进行间接访问 ,即读取内存地址 0x2000 中的内容 42
  2. 读取 (R1)

    • (R1) 表示直接读取寄存器 R1 的值 10(如果是 ((R1)) 则需间接寻址)。
  3. 加法操作

    • 计算 42 + 10 = 52
  4. 结果写回

    • 将结果 52 存入 R1,最终 R1 = 52
关键点
  • (MDR) 是间接寻址,需通过 MDR 中的地址访问内存获取操作数。

  • (R1) 是直接寻址,直接使用寄存器值。

  • 该指令的实际含义是:将 MDR 指向的内存单元的值与 R1 的值相加,结果存回 R1


3. 间接寻址的硬件支持

  • MAR(Memory Address Register) :存储要访问的内存地址(如 0x10000x2000)。

  • MDR(Memory Data Register):临时存储从内存读出的数据(地址或操作数)。

  • 总线协作:地址总线传送 MAR 中的地址,数据总线传输 MDR 的内容。


4. 间接寻址 vs. 直接寻址

特性 间接寻址 直接寻址
操作数获取 需多次访存(先取地址,再取数据) 直接访问内存或寄存器
指令格式 ADD R1, (R2) ADD R1, 0x2000
MDR 内容 存储最终操作数的地址 存储操作数本身(无需间址)

5. 实际应用场景

  • 函数指针调用:通过指针间接跳转到目标函数地址。

  • 动态数据结构 :如链表的 next 指针通过间接寻址访问下一个节点。

  • 系统调用:内核通过间接寻址访问用户空间传递的指针参数。


总结

  1. 间接寻址过程

    • 先通过寄存器/内存获取中间地址,再通过该地址访问最终操作数。

    • 间址周期后,MDR 存储的是最终操作数的地址(需进一步访存获取值)。

  2. (MDR) + (R1) → R1

    • 表示将 MDR 指向的内存值(42)与 R1 的值(10)相加,结果(52)写回 R1。
  3. 硬件依赖:MAR/MDR 和总线协作完成间址访存。