第 4 章 指令系统
本章地位:指令系统是硬件与软件的接口,也是组成原理最容易出综合大题的章节之一(扩展操作码设计、寻址方式 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 操作码与地址码
② "地址码 16 位"与"主存 64 KB"成立的前提是直接寻址 + 按字节编址;若按字编址(字长 32 位),范围是 16K×32 bit = 64 KB 容量不变,但单元数不同;
③ 操作码位数与地址码位数此消彼长:指令字长一定时,想让指令条数多就得压缩地址码,想让寻址范围大就得减少指令种类——这正是扩展操作码要解决的矛盾。
判断正误:(1) 指令中的地址码字段只能存放操作数的主存地址;(2) 采用定长操作码 8 位时,指令系统最多 256 条指令;(3) 指令字长必须与机器字长相等。
查看答案
(1) 错:地址码还可以放寄存器编号、立即数本身、下条指令地址(四地址指令的 A4)或位移量(相对寻址)。
(2) 对:\(2^{8}=256\)(\(\checkmark\):\(2^{8}=256\)),定长操作码的编码空间全部用于区分指令。
(3) 错:单字长、半字长、双字长指令都合法,指令字长与机器字长可以不同。
4.1.2 按地址码个数分类:四 / 三 / 二 / 一 / 零地址指令 高频考点
- 四地址指令 OP A1 A2 A3 A4:(A1) OP (A2) → A3,A4 给出下一条指令的地址。共 4 次访存潜力(取指 1 + 取两数 2 + 存结果 1);A4 占位太长,且 PC 出现后冗余,现代机器已不采用;
- 三地址指令 OP A1 A2 A3:(A1) OP (A2) → A3,下条指令地址由 PC 自动加"1"形成("1" = 一条指令占的编址单位数);
- 二地址指令 OP A1 A2:(A1) OP (A2) → A1(结果覆盖目的操作数),最多见的一类;
- 一地址指令 OP A:一类是 (ACC) OP (A) → ACC(累加器 ACC 隐含作另一操作数与结果);另一类是自增 / 自减型(A 既是源又是目的);
- 零地址指令 OP:无地址码,操作数隐含在栈顶与次栈顶(堆栈计算机),如 PUSH / POP / ADD。
| 类型 | 下条指令地址 | 另一操作数 / 结果去向 | 典型适用场景 |
|---|---|---|---|
| 四地址 | 显式存于 A4 | 结果 → A3 | 早期机器;A4 冗余,现代不用 |
| 三地址 | PC 自动加"1" | 结果 → A3 | 大型机、经典 RISC(面向寄存器) |
| 二地址 | PC 自动加"1" | 结果 → A1(覆盖目的数) | 小 / 微型机,最常用 |
| 一地址 | PC 自动加"1" | 隐含 ACC:\(\text{(ACC)}\,\text{OP}\,\text{(A)}\to\text{ACC}\) | 累加器型机器 |
| 零地址 | PC 自动加"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
- RR 型(Register-Register):两个操作数都在寄存器中。指令短、执行快,执行阶段不访存;
- RS 型(Register-Storage):一个在寄存器、一个在主存。执行阶段需访存取数,结果若存回主存还要再访存;
- SS 型(Storage-Storage):两个操作数都在主存。指令长(地址码宽)、执行阶段访存最频繁,速度最慢。
某机指令字长与存储字长均为 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 扩展操作码技术 大题重点
② 长操作码的高位段必须是短码中"预留未用"的编码。设字长 16 位、地址码各 4 位:三地址指令操作码 4 位,最多 16 种,但若还要留扩展,至多 15 条,编码 0000~1110,把 1111 留作扩展标志;二地址指令操作码 8 位,高 4 位必为 1111……如此逐级"嵌套"。
某机指令字长 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 条,则一地址以后无编码可用,属于"不可行"设计。
某机指令字长 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}\)。
② 验算时常犯数值错:\(2^{12}=4096\)、\(2^{8}=256\)、\(2^{4}=16\)、\(2^{16}=65536\),先默写再代;
③ 各级"最多条数"会互相挤占:零地址想多,二、一地址就得少——大题问"零地址最多"时,意味着前面各级按题目给定值取最少占用或按题面固定值计算。
某机指令字长 16 位,采用扩展操作码:三地址指令地址码各 4 位。(1) 若只设三地址指令,最多几条?(2) 若还需设二地址指令(地址码各 4 位)若干条,三地址最多几条?(3) 判断:"短操作码可以与某长操作码的高位完全相同"对不对?
查看答案
(1) 只有这一类时 OP 独占 4 位全空间:最多 \(2^{4}=16\) 条。
(2) 必须至少留 1 个 4 位编码作扩展标志:三地址最多 \(16-1=15\) 条。
(3) 错:短码若是长码前缀,译码器读到短码即认为指令结束,长短两条指令无法区分——违反前缀码规则,这正是扩展操作码的第一条铁律。
4.3 指令寻址与数据寻址
4.3.1 指令寻址:顺序寻址与跳跃寻址
4.3.2 数据寻址与有效地址 EA 总览
某机主存按字节编址,转移指令占 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 立即、直接、隐含、间接寻址
某机主存按字节编址,指令字长 = 存储字长 = 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 寄存器寻址与寄存器间接寻址
② 寻址范围看谁:寄存器寻址不涉及主存地址;寄存器间接的寻址范围 = 寄存器位数(可达全地址空间),与地址码位数无关;
③ 基址 / 变址寄存器若是通用寄存器中"指定的某一个",指令仍需给出编号——不算隐含寻址。
4.4.3 基址寻址、变址寻址、相对寻址 高频考点
某机主存按字节编址,字长 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;元素长度超过编址单位时别忘了乘。
下列关于基址寻址与变址寻址的叙述中,错误的是( )
A. 基址寄存器的内容通常由操作系统确定,用户程序不能直接修改
B. 变址寻址中形式地址提供基准、变址寄存器提供变化量,适合处理数组和循环
C. 基址寻址中基址寄存器的位数可以大于形式地址的位数,从而扩大寻址范围
D. 基址寻址与变址寻址的 EA 公式不同,前者面向用户、后者面向操作系统
查看解答
D。逐项分析:
A 对:基址面向 OS,用于重定位,用户可改的只是 A;B 对:变址= 基准 + 变化量,与循环变量天然对应;C 对:BR 位长 > A 位长即可扩展 EA 的覆盖范围(A 12 位 + BR 20 位 → 寻址 1M)。
D 错在两处反着说:两者 EA 公式同形(寄存器 + A),且基址面向 OS、变址面向用户——命题人把方向说反是这一考点的标准设错手法。
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(相对寻址转移)
② 位移量位数少是设计意图(转移目标多在附近),不是缺陷——题目问"为何位移字段只给 7 位"就答"节省指令字长,且局部性原理下够用";
③ 基址、变址、相对算 EA 都不访存(寄存器参与加法),别与间址的"读主存取地址"混淆。
4.4.4 堆栈寻址
进栈 PUSH X: SP ← (SP) - 1 ; 先改指针(指向新空位)
(SP) ← (X) ; 再压入数据
出栈 POP Y: Y ← ((SP)) ; 先弹出数据(读栈顶)
SP ← (SP) + 1 ; 再改指针(退回上一格)
另一种约定(SP 指向"待压入的空单元")次序恰好相反:进栈先压后改、出栈先改后弹。两种约定都正确,关键是同一台机器内前后一致;真题会给具体微操作序列,判断标准只有一条:数据写 / 读的单元必须与 SP 最终指向的栈顶一致。
② 软堆栈"进栈 1 次访存"指执行阶段(取指另计 1 次);硬堆栈执行阶段不访存;
③ 栈底不动、栈顶动:进栈出栈改变的是 SP 而不是堆栈区位置;两数运算型零地址指令(如 ADD)弹出两个、压回一个,SP 净变化 +1 个单元。
某机软堆栈向低地址生长,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 次取指;零地址指令也不例外。
(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) | 1 | 0 | 1 | 缩短指令字长;累加器机、一地址指令 |
| 立即寻址 | 无 EA(操作数 = A 本身) | 1 | 0 | 1 | 最快;给寄存器 / IX 赋初值;范围受 A 位数限制 |
| 直接寻址 | \( \text{EA} = A \) | 1 | 1 | 2 | 简单直观;寻址范围 ≤ \(2^{A\text{位数}}\) |
| 一次间接寻址 | \( \text{EA} = (A) \) | 1 | 2 | 3 | 扩大寻址范围;子程序返回;N 次间址取数 N+1 次 |
| 寄存器寻址 | \( \text{EA} = R_i \)(数在寄存器) | 1 | 0 | 1 | 不访存、指令短;速度最快的数据寻址之一 |
| 寄存器间接寻址 | \( \text{EA} = (R_i) \) | 1 | 1 | 2 | 指令短且寻址范围大(全字长地址);"指针" |
| 基址寻址 | \( \text{EA} = (\text{BR}) + A \) | 1 | 1 | 2 | 面向 OS;程序重定位;BR 可扩大寻址范围 |
| 变址寻址 | \( \text{EA} = (\text{IX}) + A \) | 1 | 1 | 2 | 面向用户;数组、循环、字符串处理 |
| 相对寻址 | \( \text{EA} = (\text{PC}) + A \)(A 为补码) | 1 | 1 | 2 | 位置无关、程序浮动;转移指令专用(转移则取数 0 次) |
| 堆栈寻址 | \( \text{EA} = (\text{SP}) \) | 1 | 软 1 / 硬 0 | 2 / 1 | 隐含寻址;LIFO;保护现场、函数调用 |
②"取操作数访存"逐格来源:立即——数在指令里 0 次;直接——按 A 读 1 次;一次间址——读 EA 与读数各 1 次共 2 次;寄存器——访问寄存器不计;寄存器间接——按 \( (R_i) \) 读主存 1 次;基址 / 变址 / 相对——算 EA 用寄存器不访存,按 EA 读 1 次;
③ 相对寻址若用于转移指令,目标地址送 PC,执行阶段取数访存 0 次,全指令仅取指 1 次。
某机主存按字节编址,指令字长 = 存储字长 = 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 次"。抓住"地址放在哪",全部数字都能现场推出,不必背表。
(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 送分考点
| 对比项(约 10 项) | CISC(复杂指令集) | RISC(精简指令集) |
|---|---|---|
| ① 指令系统 | 庞大、复杂,通常 200 条以上 | 精简,通常不超过 100 条 |
| ② 指令字长 | 不固定(变长指令) | 定长(多数 4 B) |
| ③ 寻址方式 | 多(一般多于 10 种) | 少(一般不超过 4 种) |
| ④ 访存指令 | 不受限,几乎所有指令都可访存 | 只有 LOAD / STORE 两条访存指令 |
| ⑤ 各种指令执行时间 | 相差很大(有的要多个周期) | 绝大多数 1 个时钟周期完成 |
| ⑥ 通用寄存器数量 | 较少(受指令编码限制) | 多(几十到上百个) |
| ⑦ 控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑(硬布线)控制 |
| ⑧ 指令流水线 | 难以为优化(变长、周期不等) | 易实现并优化,一般单周期发出一条 |
| ⑨ 对高级语言支持 | 靠一条条复杂指令缩小语义差距 | 靠优化编译,编译器更简单直接 |
| ⑩ 功耗与研制周期 | 功耗高、研制周期长、成本高 | 功耗低、研制周期短、性价比高 |
② "RISC 一定不能实现复杂功能"——错,复杂功能由简单指令序列(编译优化)组合完成;
③ CISC 与 RISC 已互相融合(如 x86 内部把 CISC 指令拆成类 RISC 微操作执行),判断题里"现代 x86 是纯 CISC"之类说法要警惕;
④ 只有 LOAD / STORE 访存 + 定长指令 + 大量寄存器,目的都是让流水线畅通,不是为省存储器。
下列关于 RISC 的叙述中,错误的是( )
A. RISC 的指令条数一般少于 100 条,指令定长、格式种类少
B. RISC 中只有 LOAD / STORE 指令可以访问存储器
C. RISC 采用大量通用寄存器,绝大多数指令可在 1 个时钟周期内完成
D. RISC 为了兼容老软件,必须保留全部复杂指令并主要采用微程序控制
查看解答
D。逐项分析:
A、B、C 都是 RISC 的教科书特征:指令精简定长、访存专责 LOAD / STORE、寄存器多且大多单周期完成;
D 全反:RISC 恰恰砍掉复杂指令、主要采用组合逻辑(硬布线)控制,"保留全部复杂指令 + 微程序"是 CISC 的画像;"必须兼容老软件"也不是 RISC 的设计约束。
判断正误:(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 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有计数、地址题均要求代入具体数值逐步演算,并用守恒式或第二方法验算。
指令系统中,指令由两部分组成,它们是( )
A. 操作码与地址码 B. 源操作数与目的操作数 C. 操作码与操作数 D. 位移量与寄存器编号
查看答案
A。操作码指明"做什么",地址码指明"对谁做"(操作数地址 / 寄存器编号 / 下条指令地址)。C 错在把"操作数"放进指令格式——操作数通常在寄存器或主存中,不在指令里(立即寻址例外,但那是地址码字段的内容)。
三地址指令不必像四地址指令那样给出"下一条指令的地址",其原因是( )
A. 三地址指令只能顺序执行,永远不转移 B. PC 在取指后自动加"1"形成下条指令地址 C. 下条指令地址存放在 ACC 中 D. 三地址指令的 A3 兼作下条指令地址
查看答案
B。PC 的自增取代了四地址指令的 A4,这是 PC 机制带来的指令字长节省。A 错:三地址机器照样有转移指令(跳跃寻址时转移指令自行修改 PC);C、D 均无依据。
零地址指令 ADD 的两个操作数分别来自( )
A. 主存中两个固定单元 B. 栈顶与次栈顶 C. ACC 与主存 D. 两个通用寄存器 R0、R1
查看答案
B。堆栈计算机的运算型零地址指令隐含约定:弹出栈顶与次栈顶两个数,运算结果压回栈顶(SP 净变化 1 个单元)。A 是 SS 型二地址指令的画面;C 是一地址(累加器型)指令的画面。
采用扩展操作码时,对操作码编码的基本要求是( )
A. 短操作码不能与任何长操作码的前缀相同 B. 各类指令的操作码位数必须相等 C. 长操作码的高位可以任意选取 D. 零地址指令必须排在三地址指令之前
查看答案
A。前缀码规则:若某短码是长码的前缀,译码器读到短码便提前判定指令种类,长短无法区分。B 是定长操作码的要求;C 错——长码高位必须逐级取"预留标志";D 无此要求,安排顺序与编码无关。
某机指令字长 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 条。
为使程序在主存中整体搬移后,段内转移指令依然有效,应采用的寻址方式是( )
A. 直接寻址 B. 间接寻址 C. 相对寻址 D. 基址寻址
查看答案
C。相对寻址 \( \text{EA}=(\text{PC})+A \):目标与转移指令的相对距离固定,程序整体平移后 PC 与目标同移,EA 随之平移,指令不必修改——位置无关。D 基址寻址用于重定位数据访问(改 BR 即可),但它面向 OS、典型用于操作数而非段内短转移;A 直接寻址写入的是绝对地址,搬家即失效。
某机按字节编址,相对寻址转移指令占 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——典型干扰项。
下列关于基址寻址的叙述中,正确的是( )
A. 基址寄存器的内容由用户程序随时修改 B. 基址寻址的主要目的是扩大寻址范围并支持程序重定位 C. 基址寻址最适合处理数组与循环 D. 基址寻址的 EA 为 \( (\text{IX})+A \)
查看答案
B。基址面向操作系统:BR 由 OS(装入程序)设定、用户不可改(A 错),用于重定位,且 BR 位数可长于 A 以扩大寻址范围;C、D 都是变址寻址的画像——变址 EA \(=(\text{IX})+A\)、适合数组循环,命题人故意互换两组关键词。
某机软堆栈向低地址生长,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) \]从指令系统规模、指令字长、寻址方式、访存指令、执行时间、寄存器数量、控制方式、流水线等角度比较 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 访存、单周期、多寄存器、硬布线、易流水、功耗低 |