计算机组成原理 · 2027 考研计算机 408

第 4 章 指令系统

目标院校:四川大学 / 电子科技大学 | 建议用时:概念 3 小时 + 例题练习 3 小时

本章地位:指令系统是硬件与软件的接口,也是组成原理最容易出综合大题的章节之一(扩展操作码设计、寻址方式 EA 与访存次数几乎轮流出题),直接考分约 4~8 分。真题最爱考四类:① 指令格式与地址码结构(四/三/二/一/零地址各自含义,选择题);② 扩展操作码技术(大题重点:短码不能是长码的前缀,给定位数算最大指令数、设计各类指令条数组合);③ 寻址方式(EA 公式 + 取指/取数访存次数,全章最热的计算点);④ CISC 与 RISC 的对比(送分选择题)。本章把十种数据寻址方式逐一讲透,每张表的数字都逐格推导。

考点题型热度快速判据
指令格式(操作码 + 地址码)选择题★★★★地址码个数决定隐含约定:四地址含下条指令地址,零地址靠栈顶
扩展操作码设计综合大题★★★★★短码不能是长码前缀;预留编码 = 扩展入口;总编码数守恒 \(2^n\)
寻址方式 EA 与访存次数选择 / 计算★★★★★立即 0 次取数访存、直接 1 次、一次间址 2 次、寄存器 0 次
基址与变址的区别选择题★★★★ 易错基址面向 OS(重定位、扩大寻址),变址面向用户(数组、循环)
相对寻址目标地址计算题★★★★EA = (PC) + A,其中 (PC) 是取指后已加"1"的值
堆栈寻址与 SP 微操作选择 / 计算★★★先改指针还是先传数据,取决于 SP 指向满单元还是空单元
CISC 与 RISC选择题★★★★RISC:指令少、定长、LOAD/STORE 访存、易流水、多寄存器

4.1 指令格式

4.1.1 操作码与地址码

指令格式一条指令 = 操作码 OP(指明"做什么"——加、减、存数、转移)+ 地址码 A(指明"对谁做"——操作数直接地址、寄存器编号或下条指令地址)。操作码的位数 \(k\) 决定指令系统的规模:定长操作码最多支持 \(2^{k}\) 条不同指令;地址码的位数决定操作数可寻址的范围(直接寻址时 24 位地址码 = 16 MB 编址空间,按字节编址)。
指令字长一条指令的二进制位数。等于机器字长的称单字长指令,半个字长的称半字长指令,两个字的称双字长指令。指令字长固定则取指规整(一次访存取一条);字长可变(如 x86 的 1~15 字节)则结构灵活但译码复杂。408 默认讨论指令字长 = 存储字长的情形:取一条指令只需访存 1 次。
易错① 地址码字段放的不一定是操作数地址:四地址指令的 A4 放下一条指令的地址,转移指令的地址码放的是目标指令地址;
② "地址码 16 位"与"主存 64 KB"成立的前提是直接寻址 + 按字节编址;若按字编址(字长 32 位),范围是 16K×32 bit = 64 KB 容量不变,但单元数不同;
③ 操作码位数与地址码位数此消彼长:指令字长一定时,想让指令条数多就得压缩地址码,想让寻址范围大就得减少指令种类——这正是扩展操作码要解决的矛盾。
练习 1

判断正误:(1) 指令中的地址码字段只能存放操作数的主存地址;(2) 采用定长操作码 8 位时,指令系统最多 256 条指令;(3) 指令字长必须与机器字长相等。

查看答案

(1) 错:地址码还可以放寄存器编号、立即数本身、下条指令地址(四地址指令的 A4)或位移量(相对寻址)。

(2) 对:\(2^{8}=256\)(\(\checkmark\):\(2^{8}=256\)),定长操作码的编码空间全部用于区分指令。

(3) 错:单字长、半字长、双字长指令都合法,指令字长与机器字长可以不同。

4.1.2 按地址码个数分类:四 / 三 / 二 / 一 / 零地址指令 高频考点

五类指令设 OP 为操作码,各条指令完成的操作为:
  1. 四地址指令 OP A1 A2 A3 A4:(A1) OP (A2) → A3,A4 给出下一条指令的地址。共 4 次访存潜力(取指 1 + 取两数 2 + 存结果 1);A4 占位太长,且 PC 出现后冗余,现代机器已不采用;
  2. 三地址指令 OP A1 A2 A3:(A1) OP (A2) → A3,下条指令地址由 PC 自动加"1"形成("1" = 一条指令占的编址单位数);
  3. 二地址指令 OP A1 A2:(A1) OP (A2) → A1(结果覆盖目的操作数),最多见的一类;
  4. 一地址指令 OP A:一类是 (ACC) OP (A) → ACC(累加器 ACC 隐含作另一操作数与结果);另一类是自增 / 自减型(A 既是源又是目的);
  5. 零地址指令 OP:无地址码,操作数隐含在栈顶与次栈顶(堆栈计算机),如 PUSH / POP / ADD。
四地址 OP A1 A2 A3 A4 A4=下条指令地址 三地址 OP A1 A2 A3 下条地址由 PC 给出 二地址 OP A1(目的) A2(源) 结果存回 A1 一地址 OP A 另一数隐含在 ACC 零地址 OP (无地址码:操作数隐含在栈顶 / 次栈顶) 堆栈计算机 指令字长固定时:地址码越少 → 操作码可以越长 → 指令越多、指令越短;代价是隐含约定越多
图 4-1 按地址码个数分类的五种指令格式:自上而下隐含约定增多、指令字长缩短
一句话记忆四地址"自带下条地址"被 PC 淘汰;三地址"大型机 / RISC 常用";二地址"最常用";一地址"累加器机";零地址"堆栈机"。地址码减少的本质是把信息藏进隐含约定(PC、ACC、栈顶)。
类型下条指令地址另一操作数 / 结果去向典型适用场景
四地址显式存于 A4结果 → A3早期机器;A4 冗余,现代不用
三地址PC 自动加"1"结果 → A3大型机、经典 RISC(面向寄存器)
二地址PC 自动加"1"结果 → A1(覆盖目的数)小 / 微型机,最常用
一地址PC 自动加"1"隐含 ACC:\(\text{(ACC)}\,\text{OP}\,\text{(A)}\to\text{ACC}\)累加器型机器
零地址PC 自动加"1"隐含栈顶与次栈顶,结果压回栈顶堆栈计算机、逆波兰表达式求值
例 1 高频考点 地址码位数与指令功能

某机器字长 32 位,存储字长 32 位,指令字长 32 位,采用三地址指令,地址码各 8 位。(1) 操作码有几位?最多多少条指令?(2) 每个地址码的直接寻址范围是多少?(3) 执行一条三地址加法指令(取两个源操作数、结果存回主存)共访存几次?

查看解答

(1) 操作码位数 = 指令字长 − 地址码总位数:

\[ k = 32 - 3\times8 = 8\ \text{位}\quad\Rightarrow\quad \text{最多 } 2^{8} = 256\ \text{条}\quad(\checkmark) \]

(2) 每个地址码 8 位,直接寻址可覆盖 \(2^{8}=256\) 个存储单元;每个单元 32 bit = 4 B,故寻址空间 \(256\times4\,\text{B}=1\,\text{KB}\)(\(\checkmark\):256 × 4 = 1024 B)。

(3) 访存次数逐项数:取指令 1 次 + 取 (A1) 1 次 + 取 (A2) 1 次 + 结果写入 A3 1 次:

\[ 1+1+1+1 = 4\ \text{次}\quad(\checkmark) \]

套路总结:数访存次数永远从"取指 1 次"起手,再逐个数"每个主存操作数读 1 次、每个主存结果写 1 次";寄存器操作数不计访存。

4.1.3 二地址指令的三种型态:RR / RS / SS

按操作数存放位置分型设二地址运算指令为 (A1) OP (A2) → A1:
  1. RR 型(Register-Register):两个操作数都在寄存器中。指令短、执行快,执行阶段不访存;
  2. RS 型(Register-Storage):一个在寄存器、一个在主存。执行阶段需访存取数,结果若存回主存还要再访存;
  3. SS 型(Storage-Storage):两个操作数都在主存。指令长(地址码宽)、执行阶段访存最频繁,速度最慢。
访存次数推导(必会)设"取指令 1 次访存;每个主存源操作数读 1 次;结果写回 A1 若 A1 为主存地址再 1 次",则执行一条双操作数运算指令的访存次数: \[ \text{RR 型} = 1+0+0 = 1\ \text{次},\qquad \text{RS 型} = 1+1+1 = 3\ \text{次},\qquad \text{SS 型} = 1+2+1 = 4\ \text{次} \] (RS 型结果存回寄存器时为 2 次;若源操作数改为一次间址寻址,每读一个主存操作数要改为 2 次访存。)
例 2 真题风格 RR / RS / SS 型访存次数

某机指令字长与存储字长均为 32 位。执行一条"加法"二地址指令(结果写回目的操作数位置),设取指、读数、写数各需访存 1 次,则 RR 型、RS 型(结果写回主存)、SS 型的访存次数分别为( )
A. 1、3、4 B. 1、2、4 C. 2、3、4 D. 1、3、5

查看解答

A。逐型推导:

RR 型:取指 1 + 读两个寄存器 0 + 写回寄存器 0 = 1 次;

RS 型:取指 1 + 读主存操作数 1 + 读寄存器 0 + 结果写回主存目的地址 1 = 3 次;

SS 型:取指 1 + 读主存操作数 ×2 = 2 + 写回主存 1 = 4 次。

选 B 错在漏了 RS 型的"写回主存";选 D 错在把 SS 型多数了一次——目的地址只有一个,写回只算 1 次。

4.2 扩展操作码技术 大题重点

为什么需要扩展定长操作码(如固定 8 位)规则简单,但短指令用不满编码空间。扩展操作码(操作码长度可变)让地址码多的指令(指令短)配短操作码,地址码少的指令(空出的位多)配长操作码,在不增加指令字长的前提下既装下三地址指令又装下零地址指令——x86、PDP-11 均用此技术。
编码规则(两条)① 短操作码不能是长操作码的前缀——否则译码器读到短码就"提前收工",无法区分指令边界(与哈夫曼编码"前缀码"同理);
② 长操作码的高位段必须是短码中"预留未用"的编码。设字长 16 位、地址码各 4 位:三地址指令操作码 4 位,最多 16 种,但若还要留扩展,至多 15 条,编码 0000~1110,把 1111 留作扩展标志;二地址指令操作码 8 位,高 4 位必为 1111……如此逐级"嵌套"。
编码数守恒(验算利器)设字长 16 位、地址码各 4 位,各类条数为 \(n_3,n_2,n_1,n_0\),则 \[ n_3\times2^{12}+n_2\times2^{8}+n_1\times2^{4}+n_0 = 2^{16} = 65536 \] 一条三地址指令占掉 16 位编码空间中的 \(2^{12}\) 种组合(后 12 位任意)。任何"最多多少条"的答案都可用守恒式验算。
4 位 OP三地址 0000 ~ 1110:15 条三地址指令 1111:预留作扩展标志 8 位 OP二地址 1111 0000 ~ 1111 1110:15 条二地址指令 1111 1111:再预留 12 位 OP一地址 1111 1111 0000 ~ 1111 1111 1110:15 条一地址指令 1111 1111 1111:再预留 16 位 OP零地址 1111 1111 1111 0000 ~ 1111 1111 1111 1111:16 条零地址指令 合计 15+15+15+16 = 61 条 占用 = 15×2¹²+15×2⁸+15×2⁴+16 = 61440+3840+240+16 = 65536 ✓ 逐级"留一个编码作扩展标志":每一级短码都不是下一级长码的前缀(前缀码思想)
图 4-2 扩展操作码逐级嵌套示意(字长 16 位、地址码各 4 位的经典方案)
例 3 经典大题 扩展操作码方案设计

某机指令字长 16 位,每个地址码 4 位,采用扩展操作码技术。要求设计:三地址指令 15 条、二地址指令 15 条、一地址指令 15 条、零地址指令 16 条。请给出操作码编码方案并验证其合法性。

查看解答

设计(逐级预留一个扩展标志):

① 三地址指令:OP 占 4 位,取 0000~1110 共 15 条;1111 不分配,留作扩展;

② 二地址指令:OP 占 8 位,高 4 位固定为 1111,取 1111 0000~1111 1110 共 15 条;1111 1111 留作扩展;

③ 一地址指令:OP 占 12 位,高 8 位固定为 1111 1111,取 1111 1111 0000~1111 1111 1110 共 15 条;1111 1111 1111 留作扩展;

④ 零地址指令:OP 占 16 位,高 12 位固定为 1111 1111 1111,低 4 位 0000~1111 共 \(2^{4}=16\) 条,全部用满(不再需要预留)。

合法性验证一(前缀规则):三地址码 0000~1110 都不是任何二地址码(1111 ××××)的前缀;同理逐级成立 ✓。

合法性验证二(编码守恒):

\[ 15\times2^{12}+15\times2^{8}+15\times2^{4}+16 = 61440+3840+240+16 = 65536 = 2^{16}\quad(\checkmark) \]

16 位编码空间恰好用尽,方案可行。合计指令 \(15+15+15+16=61\) 条。

套路总结:设计四步走——定各级 OP 位数 → 每级"全取少一"留扩展标志 → 末级(地址码最少的一级)可取满 → 用守恒式验算。若题目要求三地址 15 条且二地址取满 16 条,则一地址以后无编码可用,属于"不可行"设计。

例 4 方法 反求某类指令的最大条数

某机指令字长 16 位,地址码各 4 位,采用扩展操作码。已知三地址指令 15 条、二地址指令 12 条、一地址指令 63 条,问零地址指令最多有多少条?

查看解答

逐级清点剩余扩展入口:

① 三地址:4 位 OP 共 16 种编码,用去 15,剩 1 个入口(1111);

② 二地址:该入口下 8 位 OP 共 \(1\times2^{4}=16\) 种组合,用去 12,剩 \(16-12=4\) 个入口(1111 1100、1111 1101、1111 1110、1111 1111);

③ 一地址:4 个入口下共 \(4\times2^{4}=64\) 种组合,用去 63,剩 \(64-63=1\) 个入口(1111 1111 1111);

④ 零地址:最后 1 个入口下 16 位 OP 已定死 12 位,剩 4 位自由:

\[ n_0^{\max} = 1\times2^{4} = 16\ \text{条}\quad(\checkmark) \]

守恒式验算:

\[ 15\times2^{12}+12\times2^{8}+63\times2^{4}+16 = 61440+3072+1008+16 = 65536\quad(\checkmark) \]

套路总结:"剩几个入口 × 下一级的自由位数"逐级下传,比死记公式稳;最后务必代守恒式核对总数等于 \(2^{16}\)。

易错① 三地址最多 16 种编码却"至多 15 条"——前提是还需要给长指令留扩展入口;若机器只有三地址一类指令,取满 16 条合法;
② 验算时常犯数值错:\(2^{12}=4096\)、\(2^{8}=256\)、\(2^{4}=16\)、\(2^{16}=65536\),先默写再代;
③ 各级"最多条数"会互相挤占:零地址想多,二、一地址就得少——大题问"零地址最多"时,意味着前面各级按题目给定值取最少占用或按题面固定值计算。
练习 2 易错

某机指令字长 16 位,采用扩展操作码:三地址指令地址码各 4 位。(1) 若只设三地址指令,最多几条?(2) 若还需设二地址指令(地址码各 4 位)若干条,三地址最多几条?(3) 判断:"短操作码可以与某长操作码的高位完全相同"对不对?

查看答案

(1) 只有这一类时 OP 独占 4 位全空间:最多 \(2^{4}=16\) 条。

(2) 必须至少留 1 个 4 位编码作扩展标志:三地址最多 \(16-1=15\) 条。

(3) 错:短码若是长码前缀,译码器读到短码即认为指令结束,长短两条指令无法区分——违反前缀码规则,这正是扩展操作码的第一条铁律。

4.3 指令寻址与数据寻址

两类寻址,先分清指令寻址——确定下一条指令地址(PC 的事);数据寻址——确定本条指令的操作数地址(EA 的事)。转移指令的"寻址"本质上是指令寻址(目标可以是直接 / 间接 / 相对等方式给出的指令地址);其余指令的地址码多用数据寻址方式。真题常把两者混在一个题干里考"取指后 PC 是多少"。

4.3.1 指令寻址:顺序寻址与跳跃寻址

顺序寻址PC 自动加"1":\( (\text{PC}) + 1\,\text{个指令字长} \to \text{PC} \)。按字节编址、指令 2 B 时,取指后 PC 实际加 2(即"1"指一条指令占的字节数)。指令顺次存放,执行自然顺序推进——取指阶段结束时 PC 已指向下一条指令,这是相对寻址计算的隐含前提。
跳跃寻址执行转移(跳转)类指令时,下条指令地址不再由 PC 顺延,而由指令的地址码按某种寻址方式形成并送入 PC:直接转移(地址码即目标地址)、相对转移(目标 = (PC) + 位移)、间接转移(地址码单元里存目标地址)等。跳跃后程序从新地址顺序执行。循环、分支、函数调用与返回都靠它实现。
一句话记忆"顺序靠 PC 自增,跳跃靠转移指令改 PC"。考相对寻址时,(PC) 永远取"已加 1 之后"的值(指向下一条指令),用取指前的旧 PC 计算是最高频失分点。

4.3.2 数据寻址与有效地址 EA 总览

EA 与形式地址指令地址码字段给出的地址记作形式地址 A;操作数所在存储单元的真实地址记作有效地址 EA(Effective Address)。各种数据寻址方式的差别,就是从 A(可能借助寄存器)换算出 EA 的规则不同。立即寻址是唯一例外:操作数本身就在指令中,谈不上 EA。
例 5 真题风格 相对寻址目标地址计算

某机主存按字节编址,转移指令占 2 个字节(第一字节操作码,第二字节为相对位移量,用 8 位补码表示)。该转移指令第一个字节存放于主存地址 2000H 处,位移量为 −112。求:(1) 取指后 PC 的内容;(2) 转移目标地址;(3) 该指令向前(地址减小方向)转移的最远距离。

查看解答

(1) 指令长 2 B,取指后 PC 自动加 2:

\[ (\text{PC}) = 2000\text{H}+2\text{H} = 2002\text{H}\quad(\checkmark) \]

(2) 位移量 −112 的补码:\(112 = 0111\,0000\text{B}\),取反加一得 \(1001\,0000\text{B}\)(\(\checkmark\):\(1001\,0000\text{B} = 90\text{H}\),最高位 1 表示负)。目标地址:

\[ \text{目标} = (\text{PC}) + [-112]_{\text{补}} = 2002\text{H} - 70\text{H} = 1\text{F}92\text{H}\quad(\checkmark) \]

(3) 8 位补码负方向最大 −128:最远到 \(2002\text{H}-80\text{H} = 1\text{F}82\text{H}\)(\(\checkmark\):0x2002 − 0x80 = 0x1F82),即向前最多 128 B。

套路总结:相对寻址三步——① PC 加"1"(按指令字节数);② 位移量补码 → 真值;③ EA = 新 PC + 真值。若误用取指前的 2000H 会得 1F90H,正好被命题人设为干扰项。

4.4 十种数据寻址方式 必考

4.4.1 立即、直接、隐含、间接寻址

立即寻址操作数 A 本身就直接写在指令里(补码形式,又称立即数),执行阶段不访存、速度最快。A 的位数限制立即数的数值范围;常用于给寄存器 / 变址器赋初值。注意:立即寻址没有 EA(# 号常用来标记立即数,如 MOV R0, #100)。
直接寻址\( \text{EA} = A \)。地址码就是有效地址,取操作数访存 1 次。寻址范围受 A 位数限制(A 为 12 位 → 只能寻 \(2^{12}=4\text{K}\) 单元);多用于小主存机器、访问固定地址的变量。
隐含寻址操作数隐含在 ACC(或栈顶)中,指令不写这个地址——一地址指令的另一个操作数就是隐含寻址的典型。省出地址码字段缩短指令字长,代价是"约定要背"。
间接寻址\( \text{EA} = (A) \):A 单元里存的不是操作数,而是操作数的地址。一次间址取操作数访存 2 次(先读 A 单元取 EA,再按 EA 读数);若 (A) 的最高位是"间址标志位",还要继续间下去,N 次间址访存 N+1 次。优点:① 扩大寻址范围(A 短、但 (A) 全字长都是 EA);② 便于子程序返回地址的存取与某些"指针"式访问。缺点:访存多、慢。
直接寻址 OP | A 主存单元 A操作数 EA=A 取数访存 1 次 一次间址 OP | A 主存单元 A存放 EA 主存单元 EA操作数 EA=(A) 取数访存 2 次 寄存器间接 OP | Ri 寄存器 Ri存放 EA 主存单元 EA操作数 EA=(Ri) 取数访存 1 次
图 4-3 直接、一次间接、寄存器间接三种寻址的取数路径对比:间接层次每加一层,取操作数多访存一次(访问寄存器不计)
例 6 高频考点 EA 与访存次数判断

某机主存按字节编址,指令字长 = 存储字长 = 32 位,完成一次访存读写需 1 个存储周期。(1) 直接寻址取一个操作数,执行阶段访存几次?(2) 一次间接寻址呢?(3) 二次间接寻址呢?(4) 若该操作数改用寄存器间接寻址呢?

查看解答

(1) 直接寻址 \( \text{EA}=A \):按 A 读一次主存即得操作数 → 1 次。

(2) 一次间址 \( \text{EA}=(A) \):先访存读 A 单元得 EA(1 次),再访存按 EA 读操作数(1 次)→ 2 次。

(3) 二次间址 \( \text{EA}=((A)) \):读 A 得第一个 EA → 按 EA 再读得真正 EA → 再读操作数,共 3 次——N 次间址 N+1 次。

(4) 寄存器间接 \( \text{EA}=(R_i) \):访问寄存器不占存储周期,按 EA 读主存一次 → 1 次。

套路总结:数"读主存的箭头个数"。间接每深一层加一次;寄存器本身(无论直读还是取其中地址)都不计访存。

4.4.2 寄存器寻址与寄存器间接寻址

寄存器寻址\( \text{EA} = R_i \):操作数就在寄存器 \(R_i\) 中,指令的地址码字段放寄存器编号(位数极少,如 4 位编 16 个寄存器)。执行阶段不访存、速度快、指令字长短,是现代 CPU 用得最多的方式。
寄存器间接寻址\( \text{EA} = (R_i) \):寄存器里存的是操作数的主存地址。兼得两个好处——指令短(只放寄存器编号)+ 寻址范围大(\(R_i\) 全字长都是地址);取操作数访存 1 次。把 \(R_i\) 当"指针变量"看最容易理解。
易错① 寄存器寻址 0 次访存、寄存器间接 1 次访存,一字之差考了很多年;
② 寻址范围看谁:寄存器寻址不涉及主存地址;寄存器间接的寻址范围 = 寄存器位数(可达全地址空间),与地址码位数无关;
③ 基址 / 变址寄存器若是通用寄存器中"指定的某一个",指令仍需给出编号——不算隐含寻址。

4.4.3 基址寻址、变址寻址、相对寻址 高频考点

基址寻址\( \text{EA} = (\text{BR}) + A \)。基址寄存器 BR 面向操作系统:内容由操作系统(装入程序)确定,用户不能修改(用户只能改形式地址 A)。两大用途:① 程序重定位——程序装到主存任何位置,只需改 BR,指令中的 A 不用动(多道程序系统的基石);② 扩大寻址范围——BR 位数可长于 A:A 为 12 位只能寻 4K,若 BR 为 20 位,EA 可覆盖 \(2^{20} = 1\text{M}\) 空间。
变址寻址\( \text{EA} = (\text{IX}) + A \)。变址寄存器 IX 面向用户:程序执行中随时可修改 IX(加减、清零)。形式地址 A 给基准(不动的基地,如数组首址),IX 给变化量(如循环变量 i)——遍历数组时 A 不变、IX 递增,恰好匹配"基址固定 + 偏移变化"的模式,故最适合处理数组与循环程序,也便于字符串处理、向量运算。取操作数访存 1 次。
相对寻址\( \text{EA} = (\text{PC}) + A \),A 是补码位移量。以"取指后的 PC"为基准,目标随程序整体平移而平移——程序位置无关(可浮动):程序整体搬家后段内相对距离不变,转移指令不用修改。转移指令(尤其向后 / 向前短跳转)的首选方式;位移量位数少,目标只能落在 PC 附近。有的机器还支持基址 + 变址 + 位移的复合寻址 \( \text{EA}=(\text{BR})+(\text{IX})+A \)。
基址寄存器 BROS 装入,用户不可改 + 形式地址 A用户可改 = EA 程序重定位、扩大寻址范围 面向操作系统 变址寄存器 IX用户随时可改(i) + 形式地址 A数组首址(不动) = EA 数组、循环、字符串处理 面向用户 程序计数器 PC取指后已 +"1" + 位移量 A补码,可正可负 = 目标 位置无关、转移指令专用 位移量小,跳 PC 附近 (三者 EA 公式同形:寄存器 + 形式地址;差别在"谁提供、谁来改")
图 4-4 基址、变址、相对寻址:公式同形,分工不同——基址管"程序放哪",变址管"遍历数组",相对管"跳多远"
例 7 方法 变址寻址访问数组元素

某机主存按字节编址,字长 32 位。数组 a[0..59] 从主存地址 0100H 起连续存放,每个元素占 1 个存储字。采用变址寻址的取数指令 LOAD R0, a(IX):形式地址 A = 0100H(a 的首址),变址寄存器 IX 当前内容为 0006H。求:(1) 有效地址 EA 与取到的元素;(2) 该指令执行阶段的访存次数;(3) 遍历整个数组时,哪一部分在指令里始终不变?

查看解答

(1) \[ \text{EA} = (\text{IX}) + A = 0006\text{H} + 0100\text{H} = 0106\text{H}\quad(\checkmark) \] 取到的是 a[6](元素 0 在 0100H,元素 i 在 \(0100\text{H}+i\))。

(2) EA 由寄存器与指令字段相加得到,不访存;按 EA 读主存取操作数 → 1 次。

(3) 形式地址 A(数组首址 0100H)始终不变,每轮循环只把 IX 加 1(\(0000\text{H}\to0059\text{H}\))——"基址固定、偏移变化"正是变址寻址的本职。

套路总结:数组题先把"元素 i 的地址 = 首址 + i × 元素长度"写出来,再对号入座哪项进 A、哪项进 IX;元素长度超过编址单位时别忘了乘。

例 8 真题风格 基址与变址辨析

下列关于基址寻址与变址寻址的叙述中,错误的是( )
A. 基址寄存器的内容通常由操作系统确定,用户程序不能直接修改
B. 变址寻址中形式地址提供基准、变址寄存器提供变化量,适合处理数组和循环
C. 基址寻址中基址寄存器的位数可以大于形式地址的位数,从而扩大寻址范围
D. 基址寻址与变址寻址的 EA 公式不同,前者面向用户、后者面向操作系统

查看解答

D。逐项分析:

A 对:基址面向 OS,用于重定位,用户可改的只是 A;B 对:变址= 基准 + 变化量,与循环变量天然对应;C 对:BR 位长 > A 位长即可扩展 EA 的覆盖范围(A 12 位 + BR 20 位 → 寻址 1M)。

D 错在两处反着说:两者 EA 公式同形(寄存器 + A),且基址面向 OS、变址面向用户——命题人把方向说反是这一考点的标准设错手法。

用变址寻址对数组 a[0..n-1] 求和(伪代码)
IX ← 0              ; 变址寄存器清零(i = 0)
SUM ← 0             ; 累加器清零
LOOP: LOAD  R0, A(IX)   ; 变址寻址:EA = (IX) + A,A 为数组首址
      ADD   SUM, R0     ; 累加
      INC   IX          ; IX ← (IX) + 1,修改变址量
      CMP   IX, n       ; i 与 n 比较
      BLT   LOOP        ; 若 IX < n 则转 LOOP(相对寻址转移)
一张图记住三种"加法寻址"基址:程序搬家我不动(BR 装新起点);变址:数组遍历我只动 IX(A 是首址);相对:整体平移跳转不失效(位移跟着程序走)。考试只问"谁面向谁 / 谁可修改",答"基址 OS 不可改、变址用户随便改"即得分。
易错① 相对寻址的 A 是补码位移量,可正可负;判断"能向前跳多远"就找 A 的负向极值(8 位 A 为 −128);
② 位移量位数少是设计意图(转移目标多在附近),不是缺陷——题目问"为何位移字段只给 7 位"就答"节省指令字长,且局部性原理下够用";
③ 基址、变址、相对算 EA 都不访存(寄存器参与加法),别与间址的"读主存取地址"混淆。

4.4.4 堆栈寻址

堆栈与 SP堆栈是"后进先出(LIFO)"的存储区,由堆栈指针 SP 隐含指明栈顶:压栈 / 出栈指令不写地址码,操作数地址由 SP 隐含给出,故属"隐含 + 寄存器间接"式寻址。两种实现:硬堆栈——用一组专用寄存器(寄存器堆栈),进栈出栈不访存、速度快但容量小;软堆栈——在主存中开辟一片区域(最常用),进栈出栈各访存 1 次,容量大。
进栈 / 出栈微操作的两种次序约定以"栈向低地址生长、SP 指向栈顶满单元"为例:
软堆栈进栈 PUSH X / 出栈 POP Y 的微操作次序
进栈 PUSH X:  SP ← (SP) - 1     ; 先改指针(指向新空位)
              (SP) ← (X)        ; 再压入数据
出栈 POP  Y:  Y ← ((SP))        ; 先弹出数据(读栈顶)
              SP ← (SP) + 1     ; 再改指针(退回上一格)
另一种约定(SP 指向"待压入的空单元")次序恰好相反:进栈先压后改、出栈先改后弹。两种约定都正确,关键是同一台机器内前后一致;真题会给具体微操作序列,判断标准只有一条:数据写 / 读的单元必须与 SP 最终指向的栈顶一致。
易错① 堆栈寻址 EA = (SP)(软堆栈时 SP 内容是主存地址;硬堆栈时是寄存器堆的编号),出栈、入栈都是隐含寻址,指令无地址码;
② 软堆栈"进栈 1 次访存"指执行阶段(取指另计 1 次);硬堆栈执行阶段不访存;
③ 栈底不动、栈顶动:进栈出栈改变的是 SP 而不是堆栈区位置;两数运算型零地址指令(如 ADD)弹出两个、压回一个,SP 净变化 +1 个单元。
进栈前:SP 指向 0101H(满单元) 0103H (空) 0102H 数据 c 0101H 栈顶 b 0100H 数据 a SP 进栈 PUSH d:先 (SP)−1 → SP,再写入 0103H (空) 0102H 数据 c 0101H 数据 b 0100H 栈顶 d SP 出栈 POP:先读 ((SP)),再 (SP)+1 → SP 0103H (空) 0102H 数据 c 0101H 栈顶 b(即将弹出) 0100H 数据 a SP 出栈后:SP 指向 0102H 0103H (空) 0102H 栈顶 c 0101H 数据 b 0100H 数据 a SP
图 4-5 软堆栈进栈 / 出栈过程(栈向低地址生长、SP 指向栈顶满单元):进栈"先改后压",出栈"先弹后改"
例 9 方法 连续进栈出栈求 SP

某机软堆栈向低地址生长,SP 指向栈顶满单元,当前 (SP) = 0102H。依次执行 PUSH X、PUSH Y、POP Z。求:(1) 每次操作后 SP 的内容;(2) 最终 Z 中的数据来自哪个单元;(3) 三个操作(含取指)共访存几次(设指令零地址、每次访存 1 个存储字)?

查看解答

(1) 逐次追踪:

PUSH X:SP ← 0102H − 1 = 0101H,X 写入 0101H(\(\checkmark\));

PUSH Y:SP ← 0101H − 1 = 0100H,Y 写入 0100H(\(\checkmark\));

POP Z:读 0100H 单元(即 Y)送 Z,SP ← 0100H + 1 = 0101H。

(2) Z ← ((SP)),弹出时 SP 指向 0100H,故 Z 中的数据来自 0100H 单元(最后一次压入的 Y)——后进先出。

(3) 访存计数:3 条指令取指 3 次 + PUSH 写主存 1 + PUSH 写主存 1 + POP 读主存 1:

\[ 3+1+1+1 = 6\ \text{次}\quad(\checkmark) \]

套路总结:软堆栈每次 PUSH / POP 在执行阶段各 1 次访存,别忘了每条指令还要 1 次取指;零地址指令也不例外。

练习 3

(1) 写出一次间接寻址取操作数的 EA 表达式与执行阶段访存次数;(2) 立即寻址为什么没有 EA?执行阶段访存几次?(3) 硬堆栈与软堆栈各用什么实现?进栈时执行阶段访存几次?

查看答案

(1) \( \text{EA}=(A) \);先读 A 单元取 EA、再读操作数,执行阶段访存 2 次(N 次间址为 N+1 次)。

(2) 操作数(立即数)直接存放在指令的地址码字段中,随取指一并取入 CPU,无需再找地址,故无 EA;执行阶段访存 0 次。

(3) 硬堆栈用专用寄存器组实现,进栈执行阶段不访存;软堆栈用主存一片区域实现,进栈执行阶段访存 1 次。

4.4.5 十大寻址方式对比大表 必背

寻址方式EA 公式(取操作数)取指访存取操作数访存合计特点与典型用途
隐含寻址操作数在 ACC / 栈顶(无 A)101缩短指令字长;累加器机、一地址指令
立即寻址无 EA(操作数 = A 本身)101最快;给寄存器 / IX 赋初值;范围受 A 位数限制
直接寻址\( \text{EA} = A \)112简单直观;寻址范围 ≤ \(2^{A\text{位数}}\)
一次间接寻址\( \text{EA} = (A) \)123扩大寻址范围;子程序返回;N 次间址取数 N+1 次
寄存器寻址\( \text{EA} = R_i \)(数在寄存器)101不访存、指令短;速度最快的数据寻址之一
寄存器间接寻址\( \text{EA} = (R_i) \)112指令短且寻址范围大(全字长地址);"指针"
基址寻址\( \text{EA} = (\text{BR}) + A \)112面向 OS;程序重定位;BR 可扩大寻址范围
变址寻址\( \text{EA} = (\text{IX}) + A \)112面向用户;数组、循环、字符串处理
相对寻址\( \text{EA} = (\text{PC}) + A \)(A 为补码)112位置无关、程序浮动;转移指令专用(转移则取数 0 次)
堆栈寻址\( \text{EA} = (\text{SP}) \)1软 1 / 硬 02 / 1隐含寻址;LIFO;保护现场、函数调用
表格使用说明(必读)① 合计 = 取指 1 次 + 取一个源操作数访存,默认指令字长 = 存储字长(取指只访存 1 次);若存回结果到主存,再 +1;
②"取操作数访存"逐格来源:立即——数在指令里 0 次;直接——按 A 读 1 次;一次间址——读 EA 与读数各 1 次共 2 次;寄存器——访问寄存器不计;寄存器间接——按 \( (R_i) \) 读主存 1 次;基址 / 变址 / 相对——算 EA 用寄存器不访存,按 EA 读 1 次;
③ 相对寻址若用于转移指令,目标地址送 PC,执行阶段取数访存 0 次,全指令仅取指 1 次。
例 10 综合大题 寻址方式 × 访存次数逐格推导

某机主存按字节编址,指令字长 = 存储字长 = 32 位,完成一次访存需 1 个存储周期。一条"取一个源操作数送 ACC"的单地址指令 LOAD,分别采用下表寻址方式,求执行该指令的总访存次数并填入表中(结果存 ACC,不写回主存)。

(1) 立即寻址;(2) 直接寻址;(3) 一次间接寻址;(4) 寄存器寻址;(5) 寄存器间接寻址;(6) 变址寻址;(7) 相对寻址。

查看解答

统一按"取指 1 次 + 取数 N 次"推导:

(1) 立即:操作数随指令取入,取数 0 次 → \(1+0=\)1 次;

(2) 直接 \( \text{EA}=A \):按 A 读一次 → \(1+1=\)2 次;

(3) 一次间址 \( \text{EA}=(A) \):读 A 单元 1 次 + 按 EA 读数 1 次 → \(1+2=\)3 次;

(4) 寄存器 \( \text{EA}=R_i \):操作数在寄存器 → \(1+0=\)1 次;

(5) 寄存器间接 \( \text{EA}=(R_i) \):按 \( (R_i) \) 读主存 1 次 → \(1+1=\)2 次;

(6) 变址 \( \text{EA}=(\text{IX})+A \):算 EA 不访存,按 EA 读 1 次 → \(1+1=\)2 次;

(7) 相对 \( \text{EA}=(\text{PC})+A \):按 EA 读主存 1 次 → \(1+1=\)2 次。

排成一行:立即 1、直接 2、一次间址 3、寄存器 1、寄存器间接 2、变址 2、相对 2。验算:每式都回代了"取指 1 次"的公共项,间址只比直接多"读一次地址单元",与例 6 结论一致 ✓。

套路总结:这类题只有三个模板——"数在指令里(立即)/ 数在寄存器(寄存器寻址)取数 0 次;地址在指令或寄存器里(直接、寄存器间接、基址、变址、相对)取数 1 次;地址在主存里(间址)每层 1 次再取数 1 次"。抓住"地址放在哪",全部数字都能现场推出,不必背表。

练习 4 易错

(1) 设相对寻址转移指令占 2 B,位移量 8 位补码,指令首字节地址 0100H。写出目标地址范围。(2) 判断:"相对寻址的基准是取指前的 PC 内容。"

查看答案

(1) 取指后 \( (\text{PC}) = 0100\text{H}+2 = 0102\text{H} \);8 位补码位移范围 −128~+127:

下界 \(0102\text{H}-80\text{H}=0082\text{H}\),上界 \(0102\text{H}+7\text{FH}=0181\text{H}\)(\(\checkmark\):0x102+0x7F = 0x181)。

目标地址范围 0082H ~ 0181H。

(2) 错。基准是取指后已加"1"的 PC(本题为 +2 后的 0102H);取指时 PC 已自动指向下一条指令。

4.5 CISC 与 RISC 送分考点

两条路线CISC(Complex Instruction Set Computer,复杂指令集计算机):不断给指令系统加功能指令,指令多而杂、可变长——x86 为代表。RISC(Reduced Instruction Set Computer,精简指令集计算机):只保留高频简单指令、以编译器组合实现复杂功能——MIPS、ARM、RISC-V 为代表。RISC 并非简单地"指令少",其设计哲学是让常用的更快、让流水线更顺。
对比项(约 10 项)CISC(复杂指令集)RISC(精简指令集)
① 指令系统庞大、复杂,通常 200 条以上精简,通常不超过 100 条
② 指令字长不固定(变长指令)定长(多数 4 B)
③ 寻址方式多(一般多于 10 种)少(一般不超过 4 种)
④ 访存指令不受限,几乎所有指令都可访存只有 LOAD / STORE 两条访存指令
⑤ 各种指令执行时间相差很大(有的要多个周期)绝大多数 1 个时钟周期完成
⑥ 通用寄存器数量较少(受指令编码限制)多(几十到上百个)
⑦ 控制方式绝大多数为微程序控制绝大多数为组合逻辑(硬布线)控制
⑧ 指令流水线难以为优化(变长、周期不等)易实现并优化,一般单周期发出一条
⑨ 对高级语言支持靠一条条复杂指令缩小语义差距靠优化编译,编译器更简单直接
⑩ 功耗与研制周期功耗高、研制周期长、成本高功耗低、研制周期短、性价比高
易错① "RISC 完全不采用微程序控制"——错,绝大多数用硬布线,但说"完全 / 全部"就绝对化了;
② "RISC 一定不能实现复杂功能"——错,复杂功能由简单指令序列(编译优化)组合完成;
③ CISC 与 RISC 已互相融合(如 x86 内部把 CISC 指令拆成类 RISC 微操作执行),判断题里"现代 x86 是纯 CISC"之类说法要警惕;
④ 只有 LOAD / STORE 访存 + 定长指令 + 大量寄存器,目的都是让流水线畅通,不是为省存储器。
例 11 真题风格 RISC 特征辨析

下列关于 RISC 的叙述中,错误的是( )
A. RISC 的指令条数一般少于 100 条,指令定长、格式种类少
B. RISC 中只有 LOAD / STORE 指令可以访问存储器
C. RISC 采用大量通用寄存器,绝大多数指令可在 1 个时钟周期内完成
D. RISC 为了兼容老软件,必须保留全部复杂指令并主要采用微程序控制

查看解答

D。逐项分析:

A、B、C 都是 RISC 的教科书特征:指令精简定长、访存专责 LOAD / STORE、寄存器多且大多单周期完成;

D 全反:RISC 恰恰砍掉复杂指令、主要采用组合逻辑(硬布线)控制,"保留全部复杂指令 + 微程序"是 CISC 的画像;"必须兼容老软件"也不是 RISC 的设计约束。

练习 5

判断正误:(1) CISC 指令系统庞大,各指令执行时间相差不大;(2) RISC 便于流水线实现;(3) RISC 的寻址方式通常比 CISC 少;(4) CISC 能做的事 RISC 做不了。

查看答案

(1) 错:CISC 各指令执行时间相差很大(这正是它难以高效流水的原因之一);"相差不大"是 RISC 的特征。

(2) 对:定长指令、单周期执行、LOAD / STORE 专责访存,均为流水线铺路。

(3) 对:RISC 寻址方式一般不超过 4 种,CISC 常多于 10 种。

(4) 错:功能上等价——RISC 用多条简单指令组合实现 CISC 一条复杂指令的功能。

4.6 章末自测 真题风格

限时 45 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有计数、地址题均要求代入具体数值逐步演算,并用守恒式或第二方法验算。

自测 1(选择 · ★★)

指令系统中,指令由两部分组成,它们是( )
A. 操作码与地址码 B. 源操作数与目的操作数 C. 操作码与操作数 D. 位移量与寄存器编号

查看答案

A。操作码指明"做什么",地址码指明"对谁做"(操作数地址 / 寄存器编号 / 下条指令地址)。C 错在把"操作数"放进指令格式——操作数通常在寄存器或主存中,不在指令里(立即寻址例外,但那是地址码字段的内容)。

自测 2(选择 · ★★★ 高频考点)

三地址指令不必像四地址指令那样给出"下一条指令的地址",其原因是( )
A. 三地址指令只能顺序执行,永远不转移 B. PC 在取指后自动加"1"形成下条指令地址 C. 下条指令地址存放在 ACC 中 D. 三地址指令的 A3 兼作下条指令地址

查看答案

B。PC 的自增取代了四地址指令的 A4,这是 PC 机制带来的指令字长节省。A 错:三地址机器照样有转移指令(跳跃寻址时转移指令自行修改 PC);C、D 均无依据。

自测 3(选择 · ★★★)

零地址指令 ADD 的两个操作数分别来自( )
A. 主存中两个固定单元 B. 栈顶与次栈顶 C. ACC 与主存 D. 两个通用寄存器 R0、R1

查看答案

B。堆栈计算机的运算型零地址指令隐含约定:弹出栈顶与次栈顶两个数,运算结果压回栈顶(SP 净变化 1 个单元)。A 是 SS 型二地址指令的画面;C 是一地址(累加器型)指令的画面。

自测 4(选择 · ★★★★ 高频考点)

采用扩展操作码时,对操作码编码的基本要求是( )
A. 短操作码不能与任何长操作码的前缀相同 B. 各类指令的操作码位数必须相等 C. 长操作码的高位可以任意选取 D. 零地址指令必须排在三地址指令之前

查看答案

A。前缀码规则:若某短码是长码的前缀,译码器读到短码便提前判定指令种类,长短无法区分。B 是定长操作码的要求;C 错——长码高位必须逐级取"预留标志";D 无此要求,安排顺序与编码无关。

自测 5(解答 · ★★★★ 大题)

某机指令字长 16 位,地址码各 4 位,采用扩展操作码。要求:三地址指令 14 条、二地址指令 20 条、一地址指令 30 条,其余全部用于零地址指令。问零地址指令最多多少条?给出推导并验算。

查看解答

逐级清点扩展入口:

① 三地址:4 位 OP 共 16 种,用 14,剩 \(16-14=2\) 个入口;

② 二地址:2 个入口下 8 位 OP 共 \(2\times2^{4}=32\) 种,用 20,剩 \(32-20=12\) 个入口;

③ 一地址:12 个入口下共 \(12\times2^{4}=192\) 种,用 30,剩 \(192-30=162\) 个入口;

④ 零地址:\(162\times2^{4}=2592\) 条。

验算(编码守恒):

\[ 14\times2^{12}+20\times2^{8}+30\times2^{4}+2592 = 57344+5120+480+2592 = 65536 = 2^{16}\quad(\checkmark) \]

零地址指令最多 2592 条。

自测 6(选择 · ★★★★)

为使程序在主存中整体搬移后,段内转移指令依然有效,应采用的寻址方式是( )
A. 直接寻址 B. 间接寻址 C. 相对寻址 D. 基址寻址

查看答案

C。相对寻址 \( \text{EA}=(\text{PC})+A \):目标与转移指令的相对距离固定,程序整体平移后 PC 与目标同移,EA 随之平移,指令不必修改——位置无关。D 基址寻址用于重定位数据访问(改 BR 即可),但它面向 OS、典型用于操作数而非段内短转移;A 直接寻址写入的是绝对地址,搬家即失效。

自测 7(计算 · ★★★)

某机按字节编址,相对寻址转移指令占 2 B,首字节存于主存 2000H 单元,位移量为 +30(8 位补码)。求转移目标地址。

查看答案

取指后 \( (\text{PC})=2000\text{H}+2=2002\text{H} \);位移 +30 = 1EH:

\[ \text{目标} = 2002\text{H}+1\text{EH} = 2020\text{H}\quad(\checkmark:\ 02\text{H}+1\text{EH}=20\text{H},\ 2+30=32\ \text{逢 16 进 1}) \]

若误用取指前的 2000H 会得到 201EH——典型干扰项。

自测 8(选择 · ★★★ 易错)

下列关于基址寻址的叙述中,正确的是( )
A. 基址寄存器的内容由用户程序随时修改 B. 基址寻址的主要目的是扩大寻址范围并支持程序重定位 C. 基址寻址最适合处理数组与循环 D. 基址寻址的 EA 为 \( (\text{IX})+A \)

查看答案

B。基址面向操作系统:BR 由 OS(装入程序)设定、用户不可改(A 错),用于重定位,且 BR 位数可长于 A 以扩大寻址范围;C、D 都是变址寻址的画像——变址 EA \(=(\text{IX})+A\)、适合数组循环,命题人故意互换两组关键词。

自测 9(计算 · ★★★)

某机软堆栈向低地址生长,SP 指向栈顶满单元,当前 (SP) = 00FFH。依次执行 PUSH A、PUSH B、POP C。求:(1) 最终 SP 内容;(2) C 中的数据来自哪个主存单元;(3) 三条指令(含取指,指令均为零地址、一次访存取指)共访存几次?

查看答案

(1) PUSH A:SP ← 00FEH,写入 00FEH;PUSH B:SP ← 00FDH,写入 00FDH;POP C:读 00FDH,SP ← 00FEH。最终 (SP) = 00FEH。

(2) C ← (00FDH),即最后一次压入的 B(LIFO)。

(3) 取指 3 次 + 两次写 + 一次读:

\[ 3+2+1=6\ \text{次}\quad(\checkmark) \]
自测 10(解答 · ★★★★)

从指令系统规模、指令字长、寻址方式、访存指令、执行时间、寄存器数量、控制方式、流水线等角度比较 CISC 与 RISC(至少 6 点),并说明为什么 RISC 的设计更利于实现指令流水线。

查看解答

① 指令条数:CISC 200 条以上,RISC 一般少于 100 条;② 指令字长:CISC 变长,RISC 定长(多 4 B);③ 寻址方式:CISC 多(10 种以上),RISC 少(不超过 4 种);④ 访存指令:CISC 各类指令均可访存,RISC 仅 LOAD / STORE;⑤ 执行时间:CISC 各指令相差很大,RISC 绝大多数 1 个周期;⑥ 通用寄存器:CISC 少,RISC 多;⑦ 控制方式:CISC 多为微程序,RISC 多为硬布线组合逻辑。

利于流水线的原因:定长指令 + 格式少 → 取指译码时间整齐划一;绝大多数指令单周期完成 → 各流水段时间均衡、瓶颈小;只有 LOAD / STORE 访存 → 访存冲突集中且可预测;寄存器多 → 减少访存等待;硬布线控制 → 译码快,与流水节拍匹配。这些特性合起来使 RISC 的流水线更容易做到"每拍流出一条指令"。

4.7 本章考点总结

考点常考题型热度核心方法
指令格式与五类地址结构选择题★★★★四地址含下条地址(被 PC 淘汰);三地址 PC 自增;二地址结果存 A1;一地址隐含 ACC;零地址靠栈顶
RR / RS / SS 型访存选择题 / 计算★★★取指 1 次起手;RR 共 1 次、RS 共 3 次、SS 共 4 次(结果写回主存时)
扩展操作码综合大题★★★★★短码不作长码前缀;逐级留 1 个扩展入口;"剩几个入口 × 下一级自由位数"逐级下传;守恒式 \(n_3 2^{12}+n_2 2^{8}+n_1 2^{4}+n_0=2^{16}\) 验算
指令寻址选择题★★★顺序:PC 自动加"1"(按指令字节数);跳跃:转移指令改写 PC
十大寻址方式 EA选择 / 计算★★★★★立即无 EA;直接 \(=A\);间址 \(=(A)\);寄存器 \(=R_i\);寄存器间接 / 堆栈 \(=(R_i)\)/\((SP)\);基址 \(=(\text{BR})+A\);变址 \(=(\text{IX})+A\);相对 \(=(\text{PC})+A\)
访存次数选择 / 计算★★★★★立即取数 0 次、直接 1 次、一次间址 2 次(N 次间址 N+1)、寄存器 0 次、寄存器间接 / 基址 / 变址 / 相对 1 次;写回结果再 +1
基址 vs 变址 vs 相对选择题★★★★ 易错基址面向 OS(重定位、扩大寻址,用户不可改 BR);变址面向用户(数组循环);相对位置无关(转移专用,基准是取指后的 PC)
堆栈寻址选择 / 计算★★★硬堆栈(寄存器)不访存、软堆栈(主存)进出各 1 次;SP 指向满单元:进栈先改后压、出栈先弹后改
CISC 与 RISC选择题★★★★RISC:少于 100 条、定长、寻址少、仅 LOAD/STORE 访存、单周期、多寄存器、硬布线、易流水、功耗低
下一步本章过关标准:例题全部独立重做;自测 10 题中至少 8 题正确;能一口气写出十种寻址方式的 EA 公式与取数访存次数,并独立完成一道扩展操作码设计 + 守恒式验算的大题。然后进入 第 5 章 中央处理器——指令周期、数据通路与流水线,本章的寻址与指令格式知识将全部派上用场。