Appearance
408 计算机组成原理
第四章 指令系统
CO-04-02 寻址方式(立即/直接/间接/寄存器/偏移/堆栈)
一、定位信息
- 圈层标注:核心层(大纲明确要求"寻址方式")
- 前置知识回顾:需要了解指令格式中"地址码字段"的含义(见CO-04-01),以及"有效地址(EA)"的概念——CPU最终要访问的操作数在内存中的实际地址。还需了解寄存器的概念(CPU内部的高速存储单元)。
- 知识网络定位:寻址方式是指令系统的"寻路机制",上承指令格式中的地址码字段设计,下启"指令执行过程"和"数据通路设计"。它是连接"指令中的地址信息"与"实际操作数位置"的桥梁。
- 考点热度:H级(高频重点) —— 寻址方式的有效地址计算是每年必考内容,选择题和大题均高频出现,尤其是基址寻址与变址寻址的区别、偏移寻址的EA计算。
二、知识点讲解
2.1 寻址方式概述
寻址方式解决的问题是:指令中给出的地址信息(形式地址A)如何转换为CPU实际访问的内存地址(有效地址EA)。不同寻址方式在灵活性、寻址范围、访问速度上各有取舍。
核心概念:
- 形式地址(A):指令地址码字段中直接给出的地址值
- 有效地址(EA):CPU最终用于访存的实际地址,由形式地址按寻址方式规则计算得出
- 操作数:真正参与运算的数据
2.2 立即寻址(Immediate Addressing)
定义:指令的地址码字段直接存放操作数本身,而非地址。
有效地址:无(操作数就在指令中)
特点:取指时即可获得操作数,无需访存,速度最快。但操作数范围受地址码位数限制,灵活性差。
典型用途:给变量赋常数、循环计数器初始化。
2.3 直接寻址(Direct Addressing)
定义:地址码字段A直接给出操作数在内存中的地址。
特点:简单直观,只需一次访存。但寻址范围受A的位数限制(如A为16位,则只能寻址 个单元),且A是固定值,程序运行时无法动态改变。
2.4 间接寻址(Indirect Addressing)
定义:地址码字段A给出的不是操作数的地址,而是存放操作数地址的内存单元的地址("地址的地址")。
其中 表示"以A为地址去内存取内容",该内容才是有效地址。
特点:寻址范围不受A位数限制(间接单元可存放全字长地址),且可通过多级间接进一步扩展。但需两次访存(第一次取EA,第二次取操作数),速度较慢。
一次间接 vs 多次间接:
- 一次间接:,访问一次内存得到EA,再访存取操作数(共2次访存)
- 多次间接:,甚至更多级(每多一级多一次访存)
2.5 寄存器寻址(Register Addressing)
定义:地址码字段A给出的是寄存器编号,操作数在该寄存器中。
(操作数直接在寄存器 中)
特点:不访存,速度极快(寄存器访问速度远高于内存)。但寄存器数量有限(如32个或64个),地址码只需少数位即可编码寄存器号。
2.6 寄存器间接寻址(Register Indirect Addressing)
定义:地址码字段给出寄存器编号,该寄存器中存放的是操作数的内存地址。
特点:比间接寻址快(寄存器访问快于内存),但取操作数仍需一次访存。适用于数组和指针操作。
2.7 偏移寻址(Offset/Displacement Addressing)
偏移寻址是一大类寻址方式的统称,核心思想是 。常见的三种:
(1)基址寻址(Base Addressing)
其中 为基址寄存器(Base Register),A为形式地址(偏移量/位移量)。基址寄存器的内容在程序运行时不变(由操作系统设定),A在指令中。
特点:适合多道程序环境——不同程序加载到不同基地址,只需修改BR即可,无需修改指令中的A。实现程序的动态重定位。
(2)变址寻址(Indexed Addressing)
其中 为变址寄存器(Index Register),A为形式地址(基地址)。注意与基址寻址的角色互换:A是固定的基地址,IX在程序运行中动态变化。
特点:非常适合数组遍历——A给出数组首地址,IX从0递增,每次访问数组下一个元素。
(3)相对寻址(Relative Addressing)
其中 为程序计数器,A为相对于当前指令地址的偏移量(可正可负,用补码表示)。
特点:程序在内存中浮动时无需修改指令地址(因为是相对于PC的偏移),适合实现程序的浮动装入和转移指令(条件跳转、循环等)。
2.8 堆栈寻址(Stack Addressing)
定义:操作数隐含在堆栈栈顶,由堆栈指针 指示。操作时自动调整SP。
特点:指令中无需显式地址码(零地址指令),适合表达式求值、函数调用/返回、递归实现。分为硬堆栈(用寄存器组实现)和软堆栈(用内存实现)。
三、记忆与理解辅助
① 有效地址计算公式汇总表(核心对比表):
| 寻址方式 | 有效地址EA | 访存次数 | 典型用途 |
|---|---|---|---|
| 立即寻址 | 无EA(操作数=A) | 0次 | 赋常数 |
| 直接寻址 | EA = A | 1次 | 访问固定地址变量 |
| 一次间接寻址 | EA = (A) | 2次 | 指针 |
| 寄存器寻址 | 操作数在 中 | 0次 | 高频操作数暂存 |
| 寄存器间接寻址 | EA = | 1次 | 数组/指针 |
| 基址寻址 | EA = | 1次 | 程序重定位 |
| 变址寻址 | EA = | 1次 | 数组遍历 |
| 相对寻址 | EA = | 1次 | 转移/分支 |
| 堆栈寻址 | EA = | 1次 | 函数调用/表达式求值 |
② 基址 vs 变址对比表(高频考点对比):
| 对比项 | 基址寻址 | 变址寻址 |
|---|---|---|
| 公式 | EA = (BR) + A | EA = A + (IX) |
| 谁变谁不变 | BR不变,A在指令中固定 | A不变(指令中),IX程序中动态修改 |
| 变化方 | 基址寄存器由OS/系统设定,运行中不改 | 变址寄存器由用户程序修改,每次循环递增 |
| 主要目的 | 程序浮动/重定位(多道程序) | 数组遍历(线性访问) |
| 对程序员透明性 | 通常对程序员透明(OS管理) | 程序员显式使用 |
| 实际使用 | 多道程序系统、动态链接 | 循环中的数组访问 |
③ 访存次数速记法:"直接一次、间接两次、寄存器零次、基址变址相对都是一次(去寄存器取基值不叫访存)"
④ 寻址方式灵活性排序(从低到高): 立即 < 直接 < 寄存器 < 寄存器间接 < 偏移(基址/变址/相对) < 间接 灵活性越高,寻址范围越大,但计算复杂度也越高。
四、例题与精解
例题1(基础巩固)
题目:设某计算机主存按字编址,指令字长和存储字长均为16位。某指令采用相对寻址,形式地址A = 0011H(补码表示),当前PC值为2000H。请问该指令执行时的有效地址EA是多少?
命题意图:考查相对寻址的有效地址计算,以及对"当前PC"的理解——取指后PC已递增。
解题过程:
- 审题分析:相对寻址公式 。关键在于"当前PC"是指令取出之后的PC值(因为取指阶段PC已自增指向下一指令)。
- 解题思路:指令字长16位 = 2字节(按字节编址),取指后PC = 2000H + 2 = 2002H。若按字编址(存储字长16位=1字),则PC = 2000H + 1 = 2001H。
- 完整步骤:
- 题目说明"按字编址",存储字长16位 = 1个字 = 1个编址单位
- 取指后 PC = 2000H + 1 = 2001H
- A = 0011H(正数,补码即原码)
- EA = 2001H + 0011H = 2012H
- 方法反思:相对寻址中"当前PC"是取指完成后的PC值,即指向下一条指令。这是最常见的易错点。若按字节编址,每条指令占2字节,PC增量为2;若按字编址,PC增量为1。
例题2(中等提升)
题目:某计算机指令格式如下:OP(4位)| MOD(3位)| A(9位)。其中MOD为寻址方式编码。设R₀为基址寄存器,当前值为1000H;R₁为变址寄存器,当前值为0020H。主存按字节编址,以下指令执行时操作数的有效地址各是多少?
| 指令 | MOD | A |
|---|---|---|
| ① | 000 | 0200H |
| ② | 001 | 0200H |
| ③ | 010 | 0200H |
| ④ | 011 | 0200H |
其中 MOD 编码含义:000=直接寻址,001=立即寻址,010=基址寻址(用R₀),011=变址寻址(用R₁)。
命题意图:综合考查多种寻址方式的EA计算,要求区分不同寻址方式的公式并正确代入。
解题过程:
- 审题分析:4条指令,MOD不同代表不同寻址方式,A均为0200H。需要逐条判断寻址方式并计算EA。
- 解题思路:根据MOD编码确定寻址方式,代入对应公式。
- 完整步骤:
- ① MOD=000 → 直接寻址:
- ② MOD=001 → 立即寻址:无EA,操作数就是0200H本身
- ③ MOD=010 → 基址寻址:
- ④ MOD=011 → 变址寻址:
- 方法反思:基址和变址公式形式上都是"基值+偏移",关键区别在于谁在程序运行中被修改。此题还提示:同一指令格式中,通过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在程序中动态修改。口诀:"基址定框架,变址扫数组"。
③ 错误表现:认为间接寻址只有一级(一次间接)。 错误原因:教材中多次间接的描述较少,考生容易忽略。 正确理解:间接寻址可以有多级(、...),每多一级多一次访存。但实际系统中很少超过两级(太慢)。判断是否为最终地址时,需看该存储单元的"间址标志位"。
④ 错误表现:把"寄存器间接寻址"与"间接寻址"混为一谈。 错误原因:两者都有"间接"二字,但间接的对象不同。 正确理解:间接寻址——A指向内存单元,该内存单元存放EA(2次访存);寄存器间接寻址——A给出寄存器号,寄存器中存放EA(1次访存,比间接寻址快)。
七、来源标注
- 依据 2026 考研统考大纲"计算机组成原理"部分"指令系统"章节
- 依据《计算机组成原理》(唐朔飞版)第四章
- 依据《计算机组成与设计:硬件/软件接口》(Patterson & Hennessy)第二章