Skip to content

408 计算机组成原理

第四章 指令系统

CO-04-02 寻址方式(立即/直接/间接/寄存器/偏移/堆栈)


一、定位信息

  • 圈层标注:核心层(大纲明确要求"寻址方式")
  • 前置知识回顾:需要了解指令格式中"地址码字段"的含义(见CO-04-01),以及"有效地址(EA)"的概念——CPU最终要访问的操作数在内存中的实际地址。还需了解寄存器的概念(CPU内部的高速存储单元)。
  • 知识网络定位:寻址方式是指令系统的"寻路机制",上承指令格式中的地址码字段设计,下启"指令执行过程"和"数据通路设计"。它是连接"指令中的地址信息"与"实际操作数位置"的桥梁。
  • 考点热度H级(高频重点) —— 寻址方式的有效地址计算是每年必考内容,选择题和大题均高频出现,尤其是基址寻址与变址寻址的区别、偏移寻址的EA计算。

二、知识点讲解

2.1 寻址方式概述

寻址方式解决的问题是:指令中给出的地址信息(形式地址A)如何转换为CPU实际访问的内存地址(有效地址EA)。不同寻址方式在灵活性、寻址范围、访问速度上各有取舍。

核心概念:

  • 形式地址(A):指令地址码字段中直接给出的地址值
  • 有效地址(EA):CPU最终用于访存的实际地址,由形式地址按寻址方式规则计算得出
  • 操作数:真正参与运算的数据

2.2 立即寻址(Immediate Addressing)

定义:指令的地址码字段直接存放操作数本身,而非地址。

有效地址:无(操作数就在指令中)

操作数=A操作数 = A

特点:取指时即可获得操作数,无需访存,速度最快。但操作数范围受地址码位数限制,灵活性差。

典型用途:给变量赋常数、循环计数器初始化。

2.3 直接寻址(Direct Addressing)

定义:地址码字段A直接给出操作数在内存中的地址。

EA=AEA = A

特点:简单直观,只需一次访存。但寻址范围受A的位数限制(如A为16位,则只能寻址 216=64K2^{16} = 64\text{K} 个单元),且A是固定值,程序运行时无法动态改变。

2.4 间接寻址(Indirect Addressing)

定义:地址码字段A给出的不是操作数的地址,而是存放操作数地址的内存单元的地址("地址的地址")。

EA=(A)EA = (A)

其中 (A)(A) 表示"以A为地址去内存取内容",该内容才是有效地址。

特点:寻址范围不受A位数限制(间接单元可存放全字长地址),且可通过多级间接进一步扩展。但需两次访存(第一次取EA,第二次取操作数),速度较慢。

一次间接 vs 多次间接

  • 一次间接:EA=(A)EA = (A),访问一次内存得到EA,再访存取操作数(共2次访存)
  • 多次间接:EA=((A))EA = ((A)),甚至更多级(每多一级多一次访存)

2.5 寄存器寻址(Register Addressing)

定义:地址码字段A给出的是寄存器编号,操作数在该寄存器中。

EA=RiEA = R_i(操作数直接在寄存器 RiR_i 中)

特点:不访存,速度极快(寄存器访问速度远高于内存)。但寄存器数量有限(如32个或64个),地址码只需少数位即可编码寄存器号。

2.6 寄存器间接寻址(Register Indirect Addressing)

定义:地址码字段给出寄存器编号,该寄存器中存放的是操作数的内存地址。

EA=(Ri)EA = (R_i)

特点:比间接寻址快(寄存器访问快于内存),但取操作数仍需一次访存。适用于数组和指针操作。

2.7 偏移寻址(Offset/Displacement Addressing)

偏移寻址是一大类寻址方式的统称,核心思想是 EA=基地址+偏移量EA = \text{基地址} + \text{偏移量}。常见的三种:

(1)基址寻址(Base Addressing)

EA=(BR)+AEA = (BR) + A

其中 BRBR 为基址寄存器(Base Register),A为形式地址(偏移量/位移量)。基址寄存器的内容在程序运行时不变(由操作系统设定),A在指令中。

特点:适合多道程序环境——不同程序加载到不同基地址,只需修改BR即可,无需修改指令中的A。实现程序的动态重定位

(2)变址寻址(Indexed Addressing)

EA=A+(IX)EA = A + (IX)

其中 IXIX 为变址寄存器(Index Register),A为形式地址(基地址)。注意与基址寻址的角色互换:A是固定的基地址,IX在程序运行中动态变化

特点:非常适合数组遍历——A给出数组首地址,IX从0递增,每次访问数组下一个元素。

(3)相对寻址(Relative Addressing)

EA=(PC)+AEA = (PC) + A

其中 PCPC 为程序计数器,A为相对于当前指令地址的偏移量(可正可负,用补码表示)。

特点:程序在内存中浮动时无需修改指令地址(因为是相对于PC的偏移),适合实现程序的浮动装入转移指令(条件跳转、循环等)。

2.8 堆栈寻址(Stack Addressing)

定义:操作数隐含在堆栈栈顶,由堆栈指针 SPSP 指示。操作时自动调整SP。

EA=(SP)EA = (SP)

特点:指令中无需显式地址码(零地址指令),适合表达式求值、函数调用/返回、递归实现。分为硬堆栈(用寄存器组实现)和软堆栈(用内存实现)。


三、记忆与理解辅助

① 有效地址计算公式汇总表(核心对比表):

寻址方式有效地址EA访存次数典型用途
立即寻址无EA(操作数=A)0次赋常数
直接寻址EA = A1次访问固定地址变量
一次间接寻址EA = (A)2次指针
寄存器寻址操作数在 RiR_i0次高频操作数暂存
寄存器间接寻址EA = (Ri)(R_i)1次数组/指针
基址寻址EA = (BR)+A(BR) + A1次程序重定位
变址寻址EA = A+(IX)A + (IX)1次数组遍历
相对寻址EA = (PC)+A(PC) + A1次转移/分支
堆栈寻址EA = (SP)(SP)1次函数调用/表达式求值

② 基址 vs 变址对比表(高频考点对比):

对比项基址寻址变址寻址
公式EA = (BR) + AEA = A + (IX)
谁变谁不变BR不变,A在指令中固定A不变(指令中),IX程序中动态修改
变化方基址寄存器由OS/系统设定,运行中不改变址寄存器由用户程序修改,每次循环递增
主要目的程序浮动/重定位(多道程序)数组遍历(线性访问)
对程序员透明性通常对程序员透明(OS管理)程序员显式使用
实际使用多道程序系统、动态链接循环中的数组访问

③ 访存次数速记法:"直接一次、间接两次、寄存器零次、基址变址相对都是一次(去寄存器取基值不叫访存)"

④ 寻址方式灵活性排序(从低到高): 立即 < 直接 < 寄存器 < 寄存器间接 < 偏移(基址/变址/相对) < 间接 灵活性越高,寻址范围越大,但计算复杂度也越高。


四、例题与精解

例题1(基础巩固)

题目:设某计算机主存按字编址,指令字长和存储字长均为16位。某指令采用相对寻址,形式地址A = 0011H(补码表示),当前PC值为2000H。请问该指令执行时的有效地址EA是多少?

命题意图:考查相对寻址的有效地址计算,以及对"当前PC"的理解——取指后PC已递增。

解题过程

  1. 审题分析:相对寻址公式 EA=(PC)+AEA = (PC) + A。关键在于"当前PC"是指令取出之后的PC值(因为取指阶段PC已自增指向下一指令)。
  2. 解题思路:指令字长16位 = 2字节(按字节编址),取指后PC = 2000H + 2 = 2002H。若按字编址(存储字长16位=1字),则PC = 2000H + 1 = 2001H。
  3. 完整步骤
    • 题目说明"按字编址",存储字长16位 = 1个字 = 1个编址单位
    • 取指后 PC = 2000H + 1 = 2001H
    • A = 0011H(正数,补码即原码)
    • EA = 2001H + 0011H = 2012H
  4. 方法反思:相对寻址中"当前PC"是取指完成后的PC值,即指向下一条指令。这是最常见的易错点。若按字节编址,每条指令占2字节,PC增量为2;若按字编址,PC增量为1。

例题2(中等提升)

题目:某计算机指令格式如下:OP(4位)| MOD(3位)| A(9位)。其中MOD为寻址方式编码。设R₀为基址寄存器,当前值为1000H;R₁为变址寄存器,当前值为0020H。主存按字节编址,以下指令执行时操作数的有效地址各是多少?

指令MODA
0000200H
0010200H
0100200H
0110200H

其中 MOD 编码含义:000=直接寻址,001=立即寻址,010=基址寻址(用R₀),011=变址寻址(用R₁)。

命题意图:综合考查多种寻址方式的EA计算,要求区分不同寻址方式的公式并正确代入。

解题过程

  1. 审题分析:4条指令,MOD不同代表不同寻址方式,A均为0200H。需要逐条判断寻址方式并计算EA。
  2. 解题思路:根据MOD编码确定寻址方式,代入对应公式。
  3. 完整步骤
    • ① MOD=000 → 直接寻址:EA=A=0200HEA = A = \text{0200H}
    • ② MOD=001 → 立即寻址:无EA,操作数就是0200H本身
    • ③ MOD=010 → 基址寻址:EA=(R0)+A=1000H+0200H=1200HEA = (R_0) + A = \text{1000H} + \text{0200H} = \text{1200H}
    • ④ MOD=011 → 变址寻址:EA=A+(R1)=0200H+0020H=0220HEA = A + (R_1) = \text{0200H} + \text{0020H} = \text{0220H}
  4. 方法反思:基址和变址公式形式上都是"基值+偏移",关键区别在于谁在程序运行中被修改。此题还提示:同一指令格式中,通过MOD字段切换寻址方式,是实际ISA设计的常见做法。

五、考情分析

  • 考查频次:近5年真题中,寻址方式几乎每年必考,平均1-3道选择题+偶尔大题子问题。
  • 常见题型:选择题(EA计算、基址vs变址辨析)、综合应用题(结合指令执行过程、数据通路)。
  • 分值占比:选择题约2-6分,综合应用题中可达5-10分。
  • 命题趋势:EA计算是基础必考,基址寻址与变址寻址的对比辨析是高频陷阱题。近年趋势是将寻址方式与"指令执行过程"(取指→译码→执行→访存→写回)结合出综合题。基于大纲与命题规律推测

六、易错点提醒

① 错误表现:相对寻址计算EA时,用指令本身的地址而非取指后的PC值。 错误原因:误以为"当前PC"就是当前指令的地址,忽略了取指阶段PC已自增。 正确理解:CPU取指流程是"先送PC内容到MAR取指令,再将PC内容+1(或+指令字长)"。相对寻址中用的PC是自增后的值,即指向下一条指令的地址。

② 错误表现:混淆基址寻址和变址寻址中"谁变谁不变"。 错误原因:两者公式形似(都是基值+偏移),且教材中有时表述不一致。 正确理解:基址寻址——基址寄存器BR不变(OS设定),形式地址A在指令中固定;变址寻址——形式地址A不变(指令中固定),变址寄存器IX在程序中动态修改。口诀:"基址定框架,变址扫数组"。

③ 错误表现:认为间接寻址只有一级(一次间接)。 错误原因:教材中多次间接的描述较少,考生容易忽略。 正确理解:间接寻址可以有多级(EA=((A))EA = ((A))EA=(((A)))EA = (((A)))...),每多一级多一次访存。但实际系统中很少超过两级(太慢)。判断是否为最终地址时,需看该存储单元的"间址标志位"。

④ 错误表现:把"寄存器间接寻址"与"间接寻址"混为一谈。 错误原因:两者都有"间接"二字,但间接的对象不同。 正确理解:间接寻址——A指向内存单元,该内存单元存放EA(2次访存);寄存器间接寻址——A给出寄存器号,寄存器中存放EA(1次访存,比间接寻址快)。


七、来源标注

  • 依据 2026 考研统考大纲"计算机组成原理"部分"指令系统"章节
  • 依据《计算机组成原理》(唐朔飞版)第四章
  • 依据《计算机组成与设计:硬件/软件接口》(Patterson & Hennessy)第二章

考研全科复习资料 - 基于2026考研统考大纲