下列关于存储程序工作方式的描述,正确的是
「存储程序工作方式」是冯·诺依曼体系结构的核心思想,由数学家冯·诺依曼在1945年提出。其要点是:
① 程序和数据都以二进制形式事先存放在主存储器(内存)中;
② CPU 执行时按照程序计数器(PC)的指示,从主存中逐条取出指令并执行;
③ 程序和数据在主存中形式相同、按地址区分,不需要额外标志来区分。
这一思想使得计算机能够自动、连续地执行程序,是现代计算机工作的基本原理。
A. 程序事先存储在磁盘中,执行时从磁盘逐条指令读取到CPU中
✗ 错误。存储程序原理中,程序存放在「主存」中而非磁盘。磁盘属于外存/辅助存储器,CPU 不能直接从磁盘取指令。程序必须先从磁盘加载到主存,然后 CPU 才能从主存中取指令执行。
B. 程序事先存储在主存中,执行时从主存逐条指令读取到CPU中 ✓
✓ 正确。这正是冯·诺依曼存储程序原理的经典描述:程序预存于主存,CPU 按照 PC 的值从主存中逐条取出指令、译码、执行。
C. 程序事先存储在主存中,所需数据必须从输入设备获取
✗ 错误。存储程序原理的关键是「程序和数据都存放在主存中」。数据不一定非要从输入设备获取,数据同样可以事先存放在主存中。
D. 在主存中为了区分数据和程序,需要在信息表示中使用相应的标志信息
✗ 错误。冯·诺依曼体系中,指令和数据在主存中的表示形式完全相同(都是二进制),不需要也不使用标志信息来区分。计算机通过指令执行的时序和上下文(取指阶段取到的是指令,执行阶段取到的是数据)来区分二者。
🔑 存储程序原理的核心口诀:「程序预存主存中,逐条取出自动行」。
三个关键词记忆:
• 主存(不是磁盘、不是输入设备)
• 事先存储(预先加载)
• 逐条取出执行(由 PC 控制顺序)
区分点:程序和数据在主存中形式相同,靠「取指/执行时序」区分,不靠标志位。
第1章 计算机系统概述 — 1.2节 计算机的基本组成与工作过程(存储程序工作方式)
计算机的最终用户工作在
计算机系统可以看作一个多层次结构(层次化模型),从上到下依次为:
• 应用程序层(最上层)—— 最终用户直接使用的层面,如 Word、浏览器等
• 高级语言/编译程序层 —— 程序员编写高级语言程序,编译器将其翻译为低级指令
• 操作系统层 —— 管理硬件资源,为应用程序提供服务
• 指令集体系结构层(ISA) —— 硬件与软件的接口,定义了机器指令
• 微体系结构/硬件层(最底层)—— 具体的电路实现
不同层面的用户不同:最终用户(End User)使用应用程序,程序员工作在编译程序/操作系统层面,硬件设计师工作在微体系结构层面。
A. 应用程序层面 ✓
✓ 正确。最终用户(End User)是指那些不了解计算机内部原理、只通过应用程序完成工作的普通用户。他们直接使用的是应用软件,如办公软件、社交软件等,工作在最上层的应用程序层面。
B. 操作系统层面
✗ 错误。操作系统层面是系统管理员或系统程序员工作的层面,他们需要了解操作系统的命令和管理功能。普通最终用户一般不直接操作操作系统核心功能。
C. 编译程序层面
✗ 错误。编译程序层面是程序开发人员(程序员)工作的层面,他们需要使用编程语言编写程序,由编译器翻译。最终用户不需要编写程序。
D. 指令集体系结构层面
✗ 错误。指令集体系结构(ISA)层面是计算机体系结构设计师和底层系统程序员工作的层面,涉及机器指令的定义和使用,普通最终用户完全不接触。
🔑 记忆口诀:「终端用户用应用,程序员写高级语言,系统管理靠OS」。
核心理解:层次越高,离用户越近。最终用户 = 最高层 = 应用程序层。
「最终用户」的关键特征:不关心计算机内部如何工作,只关心应用程序能否完成任务。
第1章 计算机系统概述 — 1.1节 计算机的层次结构
下列性能指标中用来表示每秒执行定点数处理指令条数的是
计算机的性能指标有多种,用于从不同角度衡量计算机的运算速度:
• CPI(Cycles Per Instruction):执行一条指令平均需要的时钟周期数,越小越好
• MIPS(Million Instructions Per Second):每秒执行百万条定点指令数,衡量定点运算速度
• MFLOPS(Million Floating-point Operations Per Second):每秒执行百万次浮点运算,衡量浮点运算速度
• 主频(Clock Rate):CPU 时钟频率,单位 Hz/MHz/GHz,表示每秒时钟周期数
题目问的是「每秒执行定点数处理指令条数」,关键词是「定点」和「每秒指令条数」。
A. CPI
✗ 错误。CPI 是 Cycles Per Instruction(每条指令的时钟周期数),它不是衡量每秒执行多少条指令的指标,而是衡量一条指令需要多少个时钟周期。
B. MIPS ✓
✓ 正确。MIPS = Million Instructions Per Second,即每秒百万条指令。它针对的是定点指令(整数指令),是衡量每秒执行定点数处理指令条数的性能指标。
C. MFLOPS
✗ 错误。MFLOPS = Million Floating-point Operations Per Second,衡量的是每秒百万次浮点运算,不是定点运算。注意区分 MIPS(定点)和 MFLOPS(浮点)。
D. 主频
✗ 错误。主频是 CPU 的时钟频率,表示每秒有多少个时钟脉冲周期,它不直接等于每秒执行的指令条数(因为一条指令可能需要多个时钟周期)。
🔑 对比记忆法:
• MIPS → M(百万) I(指令/定点) P(每) S(秒) → 定点指令速度
• MFLOPS → M(百万) FL(浮点) OP(运算) S(秒) → 浮点运算速度
关键区分:看到「定点/整数/指令条数」→ MIPS;看到「浮点/运算次数」→ MFLOPS。
CPI 和主频是更底层的参数,MIPS 可以由它们计算得出:MIPS = 主频 / (CPI × 10⁶)。
第1章 计算机系统概述 — 1.3节 计算机的性能指标
对于IEEE754浮点数表示格式,下列说法正确的是
IEEE 754 是国际通用的浮点数表示标准。以单精度(32位)为例,其格式为:
| 1位符号位(S) | 8位阶码(E) | 23位尾数(M) |
各部分的含义:
• 最高位(第31位):整个浮点数的符号位(S),0表示正,1表示负
• 阶码 E(第30~23位):采用移码(偏置值表示法),偏置值为127(单精度),不是补码也不是原码
• 尾数 M(第22~0位):存储的是尾数的小数部分,采用隐含的整数位"1"(规格化数),即实际尾数 = 1.M,尾数部分没有单独的符号位
浮点数的正负由最高位的符号位 S 决定,尾数本身不含符号位。
A. 阶码用补码表示
✗ 错误。IEEE 754 的阶码采用的是移码(biased exponent / 偏置表示法),不是补码。单精度偏置值为127,双精度偏置值为1023。移码的好处是方便比较大小。
B. 表示尾数部分的最高位为尾数的符号位
✗ 错误。IEEE 754 的尾数字段中没有符号位。尾数字段存储的是纯小数部分(规格化数隐含整数位1),浮点数的正负由最高位的 S 位决定,不是由尾数部分决定。
C. 阶码用原码表示
✗ 错误。阶码用的是移码(偏置表示),既不是原码也不是补码。移码 = 真值 + 偏置值。
D. 最高位为浮点数的符号位 ✓
✓ 正确。IEEE 754 格式中,最高位(MSB)就是整个浮点数的符号位 S,0表示正数,1表示负数。这是 IEEE 754 标准的基本结构特征。
🔑 IEEE 754 格式记忆口诀:「符-阶-尾,移码阶,隐含1」。
• 结构从高到低:符号位 → 阶码 → 尾数
• 阶码用移码(不是补码、不是原码)
• 尾数隐含整数位"1",尾数字段只存小数部分
• 浮点数正负看最高位(符号位),尾数字段没有符号位
易错点:很多人误以为阶码用补码表示,实际上 IEEE 754 用移码。
第2章 数据的表示和运算 — 2.3节 浮点数的表示(IEEE 754标准)
已知数[X]补和[Y]补,在运算器中计算[X-Y]补的方法是
补码减法是计算机中最基本的运算技巧之一。核心公式为:
[X-Y]补 = [X]补 + [-Y]补
即「减去一个数 = 加上这个数的相反数的补码」。
关键推导:如何由 [Y]补 得到 [-Y]补?
方法是:将 [Y]补 的所有位(包括符号位)逐位取反,再加1。
即:[-Y]补 = [Y]补 + 1(这里 [Y]补 表示对 [Y]补 的每一位取反)
因此:[X-Y]补 = [X]补 + [-Y]补 = [X]补 + [Y]补 + 1
题目中 [Y]补 就是对 [Y]补 按位取反的表示。
A. [X]补+[Y]补-1
✗ 错误。按位取反后应该加1才能得到 [-Y]补,减1是错误的。
B. [X]补+[Y]补+1 ✓
✓ 正确。[Y]补+1 就是 [-Y]补,所以 [X]补+[Y]补+1 = [X]补+[-Y]补 = [X-Y]补。这正是补码减法的标准实现方法。在硬件上,这个 +1 操作通过将加法器的最低位进位输入设为1来实现。
C. [X]补-[Y]补-1
✗ 错误。补码减法的核心思想就是「把减法变成加法」,这里又出现了减法操作,违背了设计初衷,且结果也不正确。
D. [X]补-[Y]补+1
✗ 错误。同样出现了减法操作,不符合补码减法的运算规则。
🔑 补码减法口诀:「减变加,取反加一」。
• 补码减法的本质:减去 Y = 加上 (-Y)
• 求 [-Y]补 的方法:对 [Y]补 「连同符号位全部取反,末位加1」
• 硬件实现:加法器 + 取反电路 + 进位输入端置1,非常简洁
特别注意:这个「取反加一」是对整个补码(包括符号位)操作,不要只对数值位操作。
第2章 数据的表示和运算 — 2.4节 定点数的加减运算(补码加减法)
在计算机中浮点数加减运算的对阶操作是
浮点数加减运算的步骤为:对阶 → 尾数运算 → 规格化 → 舍入 → 溢出判断。
对阶是第一步,目的是使两个浮点数的阶码相同,这样才能对尾数进行加减运算(类似于小数点对齐)。
对阶的原则是「小阶向大阶看齐」,即:
• 阶码较小的那个数,其阶码增大到与较大阶码相等
• 同时,该数的尾数右移相应的位数(阶码每增大1,尾数右移1位)
为什么是「小阶向大阶对齐」而不是反过来?因为:
• 尾数右移会丢失低位(精度损失小)
• 尾数左移会丢失高位(精度损失大,甚至导致结果完全错误)
所以选择小阶向大阶对齐,尾数右移,只损失低位精度。
A. 阶码较小的数,阶码增大,尾数右移 ✓
✓ 正确。这就是对阶操作的标准描述:小阶向大阶看齐,阶码增大的同时尾数右移。阶码增大1位,尾数右移1位,浮点数的值不变(因为阶码增大等于乘以基数,尾数右移等于除以基数,二者抵消)。
B. 阶码较小的数,阶码增大,尾数左移
✗ 错误。阶码增大时应该尾数右移,而非左移。阶码增大 + 尾数左移会改变浮点数的值(变大了)。
C. 阶码较大的数,阶码减小,尾数左移
✗ 错误。大阶向小阶对齐意味着尾数左移,可能丢失高位有效数字,精度损失严重,因此不采用这种方式。
D. 阶码较大的数,阶码减小,尾数右移
✗ 错误。阶码减小时应对应尾数左移才能保持值不变,而非右移。且即使操作正确,大阶向小阶对齐也不是标准做法。
🔑 对阶口诀:「小向大看齐,阶增尾右移」。
理解方法:
• 类比十进制科学计数法:1.5×10² + 3.0×10⁴ → 把 1.5×10² 变成 0.015×10⁴
• 阶码变大 = 小数点右移 = 尾数变小 = 尾数右移
• 右移丢低位(损失小),左移丢高位(损失大)→ 所以选择右移
核心原因:保护高位有效数字,牺牲低位精度。
第2章 数据的表示和运算 — 2.5节 浮点数的加减运算(对阶操作)
指令中提供了寄存器号和一个常数,若操作数地址等于寄存器内容与常数之和,则该操作数的寻址方式为
寻址方式决定了如何根据指令中给出的信息找到操作数。常见的寻址方式包括:
• 直接寻址:指令中直接给出操作数的内存地址,EA = A(A是指令中的地址字段)
• 寄存器寻址:操作数就在寄存器中,指令给出寄存器编号
• 间接寻址:指令中给出的地址所指向的内存单元中存放的是操作数的真正地址
• 偏移寻址:操作数地址 = 寄存器内容 + 偏移量(常数),即 EA = (R) + A
偏移寻址是一大类寻址方式的总称,具体可细分为:
• 基址寻址:基址寄存器内容 + 偏移量
• 变址寻址:变址寄存器内容 + 偏移量
• 相对寻址:PC 内容 + 偏移量
它们的共同特征就是「寄存器内容 + 常数」。
A. 直接寻址
✗ 错误。直接寻址中,指令直接给出操作数地址(EA = A),不涉及寄存器内容的参与。题目明确说操作数地址是「寄存器内容 + 常数」,不是纯粹的常数地址。
B. 寄存器寻址
✗ 错误。寄存器寻址是指操作数直接存放在寄存器中,指令给出寄存器号即可获取操作数。题目中操作数在内存中(需要计算地址后访问内存),不是直接在寄存器中。
C. 偏移寻址 ✓
✓ 正确。偏移寻址的特征正是:有效地址 EA = 寄存器内容 + 指令中的常数(偏移量)。指令中同时包含寄存器号和常数两部分信息,通过二者相加得到操作数的内存地址,完全符合题目描述。
D. 间接寻址
✗ 错误。间接寻址的特点是指令中给出的地址不是操作数地址,而是存放操作数地址的地址(需要二次访存)。题目描述中没有间接访问的过程。
🔑 偏移寻址的识别口诀:「寄存器 + 常数 = 偏移」。
看到「寄存器内容与偏移量(常数)相加得到地址」→ 一定是偏移寻址。
偏移寻址三兄弟(子类型):
• 基址寻址 → 基址寄存器 + 偏移量
• 变址寻址 → 变址寄存器 + 偏移量
• 相对寻址 → PC + 偏移量
共同点:都是「一个寄存器 + 一个常数」的模式。
第3章 指令系统 — 3.3节 操作数的寻址方式(偏移寻址)
下列表述中最符合RISC计算机的是
RISC(Reduced Instruction Set Computer,精简指令集计算机)与 CISC(Complex Instruction Set Computer,复杂指令集计算机)是两种不同的指令集设计理念:
RISC 的主要特征:
① 指令条数少,功能简单
② 指令长度固定(等长指令)
③ 寻址方式少而简单
④ 只有 Load/Store(取数/存数)指令能访问存储器,其他运算指令只能操作寄存器
⑤ 大量使用通用寄存器
⑥ 大多数指令可在一个时钟周期内完成
⑦ 以硬布线控制为主,少用微程序控制
CISC 的主要特征:指令多且复杂、变长指令、寻址方式丰富、大多数指令都能访问存储器。
A. 指令寻址方式丰富,大多数指令都能访问存储器
✗ 错误。这是CISC计算机的特征。RISC 的寻址方式少而简单,且只有 Load/Store 指令才能访问存储器。
B. 只有少数几条指令能访问存储器 ✓
✓ 正确。这是 RISC 的核心特征之一——Load/Store 结构。在 RISC 中,只有专门的取数(Load)和存数(Store)指令才能访问内存,所有算术逻辑运算都在寄存器之间进行。这样设计简化了指令执行流程,有利于流水线实现。
C. 指令系统中指令条数多
✗ 错误。RISC 的 R 就是 Reduced(精简),指令条数少是其基本特征。指令条数多是 CISC 的特征。
D. 指令系统中指令长度可长可短
✗ 错误。RISC 采用定长指令格式(所有指令长度相同),方便译码和流水线处理。指令长度可变是 CISC 的特征。
🔑 RISC 特征记忆口诀:「少、定、简、存取分离、多寄存器」。
• 少:指令种类少
• 定:指令长度固定
• 简:寻址方式简单
• 存取分离:只有 Load/Store 能访存(最重要的特征!)
• 多寄存器:大量使用通用寄存器
RISC vs CISC 对比记忆:
RISC → 少、定、简、分离 → 有利于流水线
CISC → 多、变、复杂、不分离 → 编程灵活但流水线困难
第3章 指令系统 — 3.5节 CISC与RISC
单周期MIPS CPU在一个时钟周期中不能同时完成
单周期 MIPS CPU 的设计特点是:每条指令在一个时钟周期内完成。其数据通路包含以下关键部件:
• 寄存器堆(Register File):有两个读端口和一个写端口。两个读端口允许同时读取两个寄存器的值,但只有一个写端口意味着在一个周期内只能写入一个寄存器。
• PC寄存器:存放当前指令地址,每条指令执行后更新
• 数据存储器:用于 Load/Store 指令的数据读写
• 指令存储器:与数据存储器分开(哈佛结构),避免结构冲突
因为寄存器堆只有一个写端口,所以一个时钟周期内不能同时对两个不同的寄存器执行写操作。
A. 对两个寄存器执行写操作 ✓
✓ 正确(不能同时完成)。MIPS 寄存器堆只有一个写端口,一个时钟周期只能写入一个寄存器。如果要同时写两个不同的寄存器,需要两个写端口,但标准 MIPS 数据通路没有这样的设计。
B. 对两个寄存器执行读操作
✗ 这是可以同时完成的。寄存器堆有两个读端口(Read Port 1 和 Read Port 2),可以在同一个时钟周期内同时读取两个寄存器的值。例如 R 型指令 add $t0, $t1, $t2 就需要同时读取 $t1 和 $t2。
C. 更新PC内容和向数据存储器写数据
✗ 这是可以同时完成的。PC 更新和数据存储器写入使用的是不同的硬件部件(PC 寄存器和数据存储器),它们可以并行工作,不存在冲突。
D. 对同一个寄存器进行读和写操作
✗ 这是可以同时完成的。利用时钟沿的不同(例如前半周期读、后半周期写,或者上升沿/下降沿分别处理),可以在同一个时钟周期内对同一个寄存器先读后写。
🔑 关键记忆:MIPS 寄存器堆 = 「两读一写」(2个读端口 + 1个写端口)。
• 能同时做的:读两个寄存器、读和写同一个寄存器、更新PC+写数据存储器
• 不能同时做的:写两个寄存器(只有一个写端口!)
理解方法:想象寄存器堆有两扇「读门」和一扇「写门」,两个人可以同时从两扇读门读数据,但只有一扇写门,所以同一时刻只能有一个人写入。
第4章 中央处理器 — 4.3节 单周期CPU的数据通路(寄存器堆的设计)
高速缓存一般采用
计算机存储器有多种类型,各有不同的速度和成本特点:
• SRAM(静态随机存取存储器):用触发器存储信息,速度快,不需要刷新,但集成度低、成本高、功耗大
• DRAM(动态随机存取存储器):用电容存储信息,速度较慢,需要定期刷新,但集成度高、成本低、功耗小
• ROM(只读存储器):只能读取不能写入(或写入困难),用于存放固定程序
• 非易失存储器:断电不丢失数据,如闪存(Flash),速度比 SRAM 慢得多
高速缓存(Cache)位于CPU和主存之间,目的是弥补CPU和主存之间的速度差距。Cache 必须足够快才能跟上CPU的速度,因此采用速度最快的 SRAM。而主存通常采用容量大但速度较慢的 DRAM。
A. 动态存储器(DRAM)
✗ 错误。DRAM 速度较慢(需要刷新),通常用于主存而非 Cache。Cache 需要极高的访问速度,DRAM 无法满足要求。
B. 静态存储器(SRAM) ✓
✓ 正确。SRAM 速度最快(存取时间通常在纳秒级),非常适合作为 Cache。虽然 SRAM 成本高、容量小,但 Cache 本身容量就不需要很大(通常 KB~MB 级别),所以成本可以接受。
C. 只读存储器(ROM)
✗ 错误。ROM 只能读不能写,而 Cache 需要频繁地读写数据(替换旧数据、写入新数据),ROM 无法胜任。
D. 非易失存储器
✗ 错误。非易失存储器(如 Flash)速度远不如 SRAM,且写入次数有限制。Cache 需要高速且频繁读写,非易失存储器不适合。此外,Cache 中的数据是主存数据的副本,断电丢失也无妨。
🔑 存储器层次结构速度对应关系:
• Cache → SRAM(快、贵、小)
• 主存 → DRAM(中、适中、中)
• 外存 → 磁盘/SSD(慢、便宜、大)
口诀:「缓存用静态,主存用动态」(Static for Cache, Dynamic for Main Memory)。
理解核心:Cache 存在的意义就是「快」,所以必须用最快的存储器技术 SRAM。
第5章 存储器层次结构 — 5.3节 高速缓存(Cache的基本原理)
一个2K×4位的存储芯片需要地址
存储芯片的容量通常用「字数 × 位数」的格式描述:
• 字数:表示存储芯片中有多少个存储单元(地址数量)
• 位数:表示每个存储单元中存放多少位数据(数据宽度)
例如「2K×4位」的含义:
• 有 2K = 2×1024 = 2048 个存储单元
• 每个存储单元存放 4 位数据
地址线的位数由字数决定(与位数无关)。要寻址 N 个存储单元,需要的地址位数 = ⌈log₂N⌉。
因为 2K = 2048 = 2¹¹,所以需要 11 位地址。
A. 10位
✗ 错误。10位地址只能寻址 2¹⁰ = 1024 = 1K 个存储单元,不够寻址 2K 个单元。
B. 11位 ✓
✓ 正确。11位地址可以寻址 2¹¹ = 2048 = 2K 个存储单元,恰好对应 2K×4位芯片的 2K 个字。注意:位数(4位)影响的是数据线的条数,不影响地址线的位数。
C. 12位
✗ 错误。12位地址可寻址 2¹² = 4K 个单元,超过了所需的寻址范围。
D. 13位
✗ 错误。13位地址可寻址 2¹³ = 8K 个单元,远超所需。
🔑 地址位数计算公式:地址位数 = log₂(字数)。
常用对照表:
• 1K = 2¹⁰ → 10位地址
• 2K = 2¹¹ → 11位地址
• 4K = 2¹² → 12位地址
• 8K = 2¹³ → 13位地址
• 64K = 2¹⁶ → 16位地址
关键区分:「字数决定地址线,位数决定数据线」。
2K×4位:11根地址线 + 4根数据线。
第5章 存储器层次结构 — 5.1节 主存储器(存储芯片的基本结构)
在MIPS指令系统中访问存储器的指令类型是
MIPS 指令系统中,所有指令长度固定为 32 位,分为三种类型:
• R 型(Register 型):寄存器型指令,三个寄存器操作数
格式:| op(6) | rs(5) | rt(5) | rd(5) | shamt(5) | funct(6) |
用途:算术逻辑运算(add、sub、and、or 等),操作数都在寄存器中
• I 型(Immediate 型):立即数型指令,包含一个 16 位立即数/偏移量
格式:| op(6) | rs(5) | rt(5) | immediate(16) |
用途:Load/Store 指令(lw、sw 等)、立即数运算(addi)、分支指令(beq、bne)
• J 型(Jump 型):跳转型指令,包含一个 26 位目标地址
格式:| op(6) | address(26) |
用途:无条件跳转(j、jal)
访问存储器的指令(如 lw、sw)需要指定基址寄存器和偏移量,恰好对应 I 型格式中的 rs(基址寄存器)和 immediate(偏移量)。
A. R型
✗ 错误。R 型指令的操作数都在寄存器中(寄存器-寄存器操作),不涉及内存访问。R 型指令用于算术逻辑运算,如 add、sub、and、or、slt 等。
B. I型 ✓
✓ 正确。MIPS 中访问存储器的指令(lw、sw、lb、sb、lh、sh 等)都是 I 型指令。I 型格式中包含一个基址寄存器号(rs)和一个 16 位偏移量(immediate),有效地址 = (rs) + offset,正好满足 Load/Store 指令的寻址需求。
C. J型
✗ 错误。J 型指令用于无条件跳转(j 和 jal),它只修改 PC 值以改变程序执行流程,不用于访问数据存储器。
D. R型、I型和J型都可以
✗ 错误。MIPS 是典型的 RISC 架构,遵循 Load/Store 结构。只有 I 型格式的 Load/Store 指令能访问存储器,R 型和 J 型都不能。
🔑 MIPS 三种指令类型功能对照:
• R 型 → 寄存器运算(Register operations)
• I 型 → 立即数运算 + 访存 + 分支(Immediate / Load-Store / Branch)
• J 型 → 跳转(Jump)
记忆口诀:「R算数,I访存,J跳转」。
为什么访存用 I 型?因为 Load/Store 指令需要「基址+偏移量」,偏移量就是 I 型中的 16 位立即数字段。
第3章 指令系统 — 3.4节 MIPS指令系统(指令格式与类型)
下列对中断向量表描述正确的是
在中断系统中,有几个容易混淆的概念需要厘清:
• 中断向量:中断服务程序的入口地址以及该程序运行所需的处理器状态字(PSW)。简单说,中断向量 = 中断服务程序的入口地址 + PSW 信息。
• 中断向量表:按照中断类型号排列的一张表,表中的每个表项就是一个中断向量(包含中断服务程序的入口地址和PSW值)。
• 向量地址(中断类型号):中断向量在中断向量表中的位置/索引,用于查找对应的中断向量。
层次关系:中断类型号(向量地址)→ 在中断向量表中找到 → 中断向量(入口地址 + PSW)→ 跳转到中断服务程序执行。
需要注意的是,中断向量表中存放的是中断服务程序的 PSW(即处理中断时 CPU 应处于什么状态),而不是被中断程序(现行程序)的 PSW。现行程序的 PSW 在中断响应时被保存到栈中。
A. 中断向量表中存放了中断指针
✗ 错误。「中断指针」不是标准术语。中断向量表中存放的是中断向量(包含中断服务程序入口地址和PSW),不是所谓的「中断指针」。
B. 中断向量表中存放了向量地址
✗ 错误。概念倒置了。向量地址是中断向量在表中的地址/索引,用于查表的"钥匙"。中断向量表中存放的是中断向量(服务程序入口地址+PSW),而不是向量地址本身。向量地址是用来定位表中条目的。
C. 中断向量表中存放了现行程序的PSW的值
✗ 错误。现行程序(被中断的程序)的 PSW 是在中断响应过程中被保存到栈中的(断点保护),不是存放在中断向量表中。中断向量表中存放的是中断服务程序需要使用的 PSW,两者不要混淆。
D. 中断向量表中存放了中断服务程序的PSW的值 ✓
✓ 正确。中断向量表的每个表项(即中断向量)包含:① 中断服务程序的入口地址(PC值);② 中断服务程序运行时需要的PSW值。当 CPU 响应中断时,从中断向量表中取出这些信息,加载到 PC 和 PSW 寄存器中,从而跳转到中断服务程序并设置正确的处理器状态。
🔑 中断向量相关概念辨析口诀:「向量地址查表用,中断向量表中存;表中放的是入口,还有服务PSW」。
三个概念的关系(从外到内):
① 向量地址(中断类型号)→ 是「钥匙」,用来在表中查找
② 中断向量表 → 是「字典」,按类型号排列
③ 中断向量(入口地址+PSW)→ 是「内容」,存放在表中
易错点:区分「现行程序的PSW」(保存到栈中)和「中断服务程序的PSW」(存在中断向量表中)。
第6章 互连及输入输出组织 — 6.3节 中断方式(中断向量与中断向量表)
在输入输出中,数据传送不是通过执行指令实现的传送方式是
计算机的输入输出(I/O)数据传送方式主要有以下几种:
• 程序直接控制方式(无条件传送):CPU 直接通过执行 I/O 指令传送数据,不查询设备状态
• 程序查询方式:CPU 先执行指令查询设备状态,就绪后再通过执行指令传送数据
• 中断方式:设备就绪后向 CPU 发中断请求,CPU 响应中断后通过执行中断服务程序中的指令传送数据
• DMA方式(Direct Memory Access,直接存储器存取):由专门的 DMA 控制器管理数据传送,数据直接在 I/O 设备和主存之间传送,不需要 CPU 执行指令
前三种方式的共同点是数据传送都需要 CPU 执行指令来完成。DMA 方式的独特之处在于:数据传送由 DMA 控制器硬件自动完成,CPU 不参与数据的实际搬运,只在传送开始和结束时介入。
A. 程序查询方式
✗ 这是通过执行指令实现的。CPU 不断执行查询指令检查设备状态,设备就绪后再执行数据传送指令(如 IN/OUT 指令)来传送数据。整个过程完全由 CPU 执行指令控制。
B. 中断方式
✗ 这也是通过执行指令实现的。虽然数据传送的时机由中断信号触发,但实际的数据传送仍然是 CPU 在中断服务程序中执行相关的数据传送指令来完成的。
C. DMA方式 ✓
✓ 正确。DMA(直接存储器存取)方式中,数据传送由 DMA 控制器(专用硬件)直接控制,数据在 I/O 设备和主存之间通过系统总线直接传送,CPU 不需要执行任何数据传送指令。CPU 只负责初始化 DMA(设置传送起始地址、字节计数等),传送过程本身完全由 DMA 控制器硬件自动完成。
D. 程序直接控制方式
✗ 从名称就可以看出,「程序直接控制」方式就是通过 CPU 执行程序中的 I/O 指令来直接传送数据的。
🔑 I/O 传送方式 CPU 参与程度递减记忆:
• 程序直接控制 → CPU 全程执行指令(最费 CPU)
• 程序查询 → CPU 执行查询 + 传送指令(很费 CPU)
• 中断 → CPU 在中断时执行传送指令(较省 CPU)
• DMA → CPU 不执行传送指令,硬件自动搬运(最省 CPU)
口诀:「前三靠指令,DMA靠硬件」。
DMA 的核心特征:数据传送不经过 CPU,直接在内存和设备之间进行。
第6章 互连及输入输出组织 — 6.4节 DMA方式
对于高密度磁盘,下列说法正确的是
磁盘的数据记录方式涉及几个重要的密度概念:
• 位密度(道密度/线密度):磁道上单位长度能存储的二进制位数,单位为 位/毫米 或 位/英寸
• 磁道密度(道密度):盘面上单位长度内的磁道数
• 面密度:位密度 × 磁道密度
对于传统的高密度磁盘(如传统软盘和早期硬盘的定角速度/CAV方式):
• 磁盘以恒定角速度(CAV)旋转
• 每个磁道存储的数据量相同(每磁道相同的扇区数、每扇区相同的字节数)
• 由于内磁道的周长短于外磁道,但存储的数据量相同
• 因此内磁道的位密度更高(相同数据量挤在更短的磁道上)
但题目问的是「高密度磁盘」,在教材语境中,这里指的是采用等密度记录方式的磁盘,内外磁道的位密度相同,外磁道因为周长更长而存储更多数据。
A. 内磁道的位密度比外磁道高
✗ 错误。这是传统等角速度(CAV)磁盘的特征(每个磁道扇区数相同、数据量相同,内道短所以位密度高)。但本题问的是「高密度磁盘」,高密度磁盘采用等密度记录方式。
B. 内磁道的位密度比外磁道低
✗ 错误。无论哪种记录方式,都不会出现内磁道位密度比外磁道低的情况。
C. 内外磁道的位密度相同 ✓
✓ 正确。高密度磁盘采用等密度记录(CLV或分区记录)方式,使得内外磁道具有相同的位密度。这样可以充分利用外磁道的存储空间(外磁道更长,可以多存数据),从而提高磁盘的总存储容量。
D. 各磁道上的扇区数相同
✗ 错误。如果内外磁道位密度相同,那么外磁道(周长更长)上的扇区数应该更多,而非各磁道相同。各磁道扇区数相同是传统 CAV 方式的特征。
🔑 两种磁盘记录方式对比:
传统磁盘(CAV,等角速度):
• 各磁道扇区数相同
• 内磁道位密度高,外磁道位密度低
• 按最内道的位密度设计,外道空间浪费
高密度磁盘(等密度记录):
• 内外磁道位密度相同
• 外磁道扇区数更多
• 充分利用磁盘空间,总容量更大
口诀:「高密度等密度,外道扇区多」。
第6章 互连及输入输出组织 — 6.5节 外部存储器(磁盘存储器的记录方式)
IEEE754单精度浮点数用二进制表示时,阶码的长度为____位,尾数的长度为____位。
在计算机中,小数(浮点数)不能像我们日常写的那样直接存储,需要一种统一的编码格式。IEEE 754就是国际上通用的浮点数表示标准。
什么是浮点数?简单来说,浮点数就是带小数点的数,比如3.14、0.001、-27.5等。"浮点"的意思是小数点的位置可以"浮动",通过调整指数(阶码)来表达不同大小的数。
浮点数的组成:一个浮点数由三部分组成:
类比理解:就像科学计数法 3.14 × 102 中,3.14是尾数,2是阶码,正号是符号。
IEEE 754标准规定了两种常用的浮点数格式:
| 格式 | 总位数 | 符号位 | 阶码位数 | 尾数位数 |
|---|---|---|---|---|
| 单精度(float) | 32位 | 1位 | 8位 | 23位 |
| 双精度(double) | 64位 | 1位 | 11位 | 52位 |
本题问的是单精度浮点数,总共32位(即4个字节):
| 1位符号 | 8位阶码 | 23位尾数 |
| S | E(8位) | M(23位) |
第31位 第30~23位 第22~0位
验算:1 + 8 + 23 = 32位,正好是4个字节,与单精度的总长度吻合。
阶码8位可以表示的范围是0~255(无符号),采用"移码"表示(偏移量为127),实际指数范围为 -126 到 +127。
尾数23位采用"隐含1"的表示法,即实际有效位数为24位(1位隐含的整数1 + 23位小数),所以单精度约有7位十进制有效数字。
口诀:"单精度1-8-23,双精度1-11-52"
记忆技巧:单精度总共32位,去掉1位符号位剩31位,阶码占8位、尾数占23位(8+23=31)。数字"8-23"可以联想成"8月23日"这个日期来记忆。
第2章 数据的表示和运算 —— 浮点数的表示方法、IEEE 754标准
MIPS计算机中,一条指令的长度为____字节,指令在主存中的存放地址值必须是____。
什么是MIPS?MIPS是一种经典的精简指令集计算机(RISC)架构,广泛应用于教学和嵌入式系统中。MIPS的全称是"Microprocessor without Interlocked Pipeline Stages"(无互锁流水线微处理器)。
什么是指令长度?计算机执行的每一个操作(如加法、跳转等)都对应一条指令。指令在存储器中以二进制形式存放,占据一定的字节数,这就是指令长度。
什么是地址对齐?为了提高访问效率,计算机要求某些数据存放在特定的地址上。比如4字节的数据必须存放在地址为4的倍数的位置上(如地址0、4、8、12……),这就叫做"对齐"(Alignment)。
第一空:4字节
MIPS是典型的RISC架构,RISC的核心设计思想之一就是定长指令。MIPS中所有指令统一为32位,即4个字节。不管是算术指令、访存指令还是跳转指令,长度都是4字节,这样做的好处是:
第二空:4的倍数
因为每条指令占4个字节,MIPS要求指令必须按字对齐方式存放,即指令的起始地址必须是4的倍数。例如:
对齐的好处是一次总线访问就能完整读出一条指令,不需要跨边界拼接,提高了效率。
口诀:"MIPS定长四字节,地址对齐四的倍"
核心关联:指令长度 = 4字节 → 对齐要求 = 4的倍数,两者是因果关系。正因为指令是4字节长,所以要求地址按4字节对齐。
对比记忆:x86(CISC)的指令长度是可变的(1~15字节不等),而MIPS(RISC)的指令长度是固定的4字节。
第3章 指令系统 —— MIPS指令格式、指令的存储与对齐
按照控制器产生微命令的方式不同,控制逻辑的控制方式分为____和____两类。
什么是控制器?控制器是CPU的核心组成部分之一,它的作用是"指挥官"——根据当前执行的指令,产生一系列控制信号(微命令),去指挥计算机各个部件协调工作。就像交通警察通过手势指挥车辆和行人一样。
什么是微命令?微命令是控制器发出的最基本的控制信号。例如"打开寄存器的输出门"、"让ALU做加法运算"、"将数据写入存储器"等,每一个这样的基本操作都对应一个微命令。
问题的关键在于:这些微命令是怎么产生的?不同的产生方式,就形成了不同的控制器设计方案。
按照产生微命令的方式不同,控制器分为以下两类:
1. 硬连线控制(也叫组合逻辑控制)
2. 微程序控制
口诀:"硬连线快但死板,微程序慢但灵活"
对比记忆:
RISC处理器多用硬连线控制(追求速度),CISC处理器多用微程序控制(指令复杂多变)。
第4章 中央处理器 —— 控制器的设计方法、硬连线控制与微程序控制
在计算机系统中,从层次结构上可以将存储器分为寄存器、高速缓存、____和____。
为什么存储器要分层次?这是因为计算机对存储器有两个矛盾的需求:
但现实是:速度越快的存储器,容量越小、价格越贵。没有一种存储器能同时满足快、大、便宜这三个要求。
解决方案:把不同速度、容量、价格的存储器组合成一个层次结构,利用程序的局部性原理(程序在一段时间内倾向于访问相近的地址),让整个系统看起来既快又大又便宜。
存储器层次结构从快到慢、从小到大依次为:
| 层次 | 名称 | 速度 | 容量 | 举例 |
|---|---|---|---|---|
| 第1层 | 寄存器 | 最快(<1ns) | 最小(几十~几百字节) | CPU内部的通用寄存器 |
| 第2层 | 高速缓存(Cache) | 很快(1~10ns) | 很小(KB~MB级) | L1/L2/L3 Cache |
| 第3层 | 主存(内存) | 较快(50~100ns) | 中等(GB级) | DDR内存条 |
| 第4层 | 辅存(外存) | 慢(ms级) | 很大(TB级) | 硬盘、SSD、U盘 |
题目已经给出了"寄存器"和"高速缓存",所以要填的就是第3层主存和第4层辅存。
层次结构的工作方式:CPU先在寄存器中找数据 → 找不到就去Cache → 再找不到去主存 → 最后才去辅存。越往上访问越频繁,越往下容量越大。
口诀:"寄高主辅四层楼,越往上走越快走"
形象记忆:把存储层次想象成一栋四层楼:
第5章 存储器层次结构 —— 存储器的分类与层次化结构
常见的输入/输出传输控制方式有程序直接控制方式、____控制方式、和____控制方式。
什么是I/O传输控制方式?计算机需要和外部设备(键盘、显示器、硬盘等)交换数据,这个过程叫做输入/输出(I/O)。由于外部设备的速度远远慢于CPU,所以需要一种合理的方式来管理CPU和外设之间的数据传输,这就是I/O传输控制方式。
核心问题是:CPU要不要参与数据传输?参与到什么程度?
三种常见的I/O控制方式,从低级到高级依次为:
1. 程序直接控制方式(查询/轮询方式)——题目已给出
2. 程序中断控制方式
3. DMA(Direct Memory Access,直接存储器访问)控制方式
口诀:"直接查询最笨,中断通知较好,DMA传输最高"
记忆三种方式的演进逻辑:CPU参与度逐渐降低
还有更高级的方式:通道控制方式和I/O处理机,但本题只问了三种最常见的。
第6章 互连及输入输出组织 —— I/O传输控制方式
寻址方式
寻址方式是指指令给出寻找操作数或操作数地址的方式或方法。
为什么需要寻址方式?CPU执行一条指令时,需要知道"操作什么数据"以及"数据在哪里"。一条指令通常包含操作码(做什么操作)和操作数(对什么数据操作)两部分。
但是,操作数可能在不同的地方:
指令用什么方法告诉CPU去哪里找到这个操作数,这种方法就叫做寻址方式。
"寻址"二字可以拆开理解:"寻"是寻找,"址"是地址。寻址方式就是"寻找地址的方式"——告诉CPU如何找到指令中需要的操作数。
常见的寻址方式包括:
答题要点:回答名词解释时,核心要说清楚寻址方式是"指令给出的寻找操作数或操作数地址的方式/方法",这是最准确的定义。
核心定义一句话:寻址方式 = 指令中指定操作数(或其地址)的方式。
类比理解:寻址方式就像快递单上写收件地址的不同格式——可以写门牌号(直接寻址),可以写"跟张三一个地址"(间接寻址),可以写"往东走100米"(相对寻址)。目的都是让快递员(CPU)找到收件人(操作数)。
第3章 指令系统 —— 寻址方式的概念与分类
动态存储器
动态存储器利用电容来存储信息,由于电容存在漏电现象,为保持其信息不丢失,需要进行刷新。
什么是半导体存储器?现代计算机的主存储器(内存)使用半导体材料制造,按照存储信息的原理不同,分为两大类:
什么是电容?电容就像一个微型的"蓄水池",可以存储电荷。电容充了电代表"1",没有电代表"0"。但电容会慢慢漏电(就像水池会慢慢渗水),所以需要定期"补水"——这就是刷新操作。
动态存储器(DRAM, Dynamic Random Access Memory)的三个核心要点:
1. 存储原理:利用电容存储信息
2. 存在的问题:电容漏电
3. 解决方案:定期刷新
对比SRAM:静态存储器用触发器(由6个晶体管组成)存储信息,只要不断电信息就不会丢失,不需要刷新。但电路复杂、集成度低、成本高,因此通常用作Cache。
答题三要素:"电容存储 → 漏电问题 → 需要刷新"
对比记忆:
| DRAM(动态) | SRAM(静态) | |
|---|---|---|
| 存储元件 | 电容 | 触发器 |
| 是否刷新 | 需要 | 不需要 |
| 速度 | 较慢 | 较快 |
| 集成度 | 高 | 低 |
| 成本 | 低 | 高 |
| 用途 | 主存 | Cache |
第5章 存储器层次结构 —— 半导体随机存取存储器、DRAM的工作原理与刷新
顺序存取存储器
顺序存取存储器中的信息按顺序存放和读出,其存取时间取决于信息存放的位置,以记录块为单位编址。
存储器的存取方式有哪些?按照访问数据的方式不同,存储器可以分为以下几种:
日常生活中的类比:
顺序存取存储器(Sequential Access Memory, SAM)的三个核心特征:
1. 信息按顺序存放和读出
2. 存取时间取决于信息存放的位置
3. 以记录块为单位编址
典型代表:磁带存储器。磁带是一条长长的带子,读写头只能从当前位置沿一个方向移动,要找到某段数据就必须从当前位置顺序走过去。
答题三要素:"按顺序存取 + 时间与位置有关 + 记录块编址"
形象记忆:想象一条火车(磁带),车厢从头到尾排列。要找第50节车厢的货物,必须从车头一节一节往后走。离车头越远,找到需要的时间越长。每节车厢就是一个"记录块"。
第5章 存储器层次结构 —— 存储器的分类、按存取方式分类
中断响应
中断响应是指主机发现外部中断请求,中止现行程序的执行,到调出中断服务程序这一过程。
什么是中断?中断是计算机中一种非常重要的机制。简单来说,当CPU正在执行某个程序时,如果有更紧急的事情(比如键盘被按下、打印机准备好了、出现错误等),外部设备会发出一个信号通知CPU:"有紧急事情,请暂停手头的工作来处理!"这个信号就叫中断请求。
生活类比:你正在写作业(执行程序),手机突然响了(中断请求),你放下笔去接电话(中断响应),接完电话(执行中断服务程序),然后回来继续写作业(恢复原程序)。
中断的完整过程包括:
中断响应是中断过程中的关键一环,它是从"发现中断请求"到"调出中断服务程序"之间的过程。具体包括以下步骤:
1. 发现中断请求
2. 中止现行程序
3. 调出中断服务程序
注意:中断响应的过程是由硬件自动完成的,不需要软件参与。而之后的中断处理(中断服务程序的执行)则是由软件完成的。
答题关键词:"发现请求 → 中止现行程序 → 调出中断服务程序"
注意区分三个容易混淆的概念:
第6章 互连及输入输出组织 —— 程序中断方式、中断响应过程
I/O端口
I/O端口是指I/O接口中能够被CPU寻址的寄存器。
要理解I/O端口,需要先弄清两个经常混淆的概念:I/O接口和I/O端口。
什么是I/O接口?I/O接口是连接CPU和外部设备之间的硬件电路(芯片或电路板),它负责协调两者之间的数据传输。因为CPU和外设在速度、信号格式、数据宽度等方面差异很大,需要I/O接口来做"翻译"和"缓冲"。
类比:I/O接口就像一个翻译员,CPU说"中文",外设说"英文",翻译员在中间帮忙沟通。
那I/O端口是什么?I/O接口内部有若干个寄存器(用来暂存数据、存放状态信息、接收控制命令等),这些寄存器中能够被CPU通过地址访问(寻址)的,就叫做I/O端口。
I/O端口的定义很简练:I/O接口中能被CPU寻址的寄存器。我们来拆解理解:
1. 位置:在I/O接口中
2. 本质:是寄存器
3. 关键特征:能被CPU寻址
注意区分:I/O接口 ≠ I/O端口。接口是整个硬件电路模块,端口是接口内部可被CPU寻址的寄存器。I/O接口包含I/O端口,就像房子(接口)里面有若干扇门(端口),CPU通过这些"门"与外设交流。
核心定义一句话:I/O端口 = I/O接口中 + 能被CPU寻址的 + 寄存器
三个关键词缺一不可:"接口中"、"可寻址"、"寄存器"。
易错点:不要把I/O端口和物理接口(如USB口、网口)混淆。物理接口是我们能看到的插孔,而I/O端口是电路内部的寄存器,是逻辑上的概念。
第6章 互连及输入输出组织 —— I/O接口的功能与组成、I/O端口及其编址方式
在带有条件标志位(ZF、OF、CF和SF)的加/减运算部件中,如何判断两个无符号数的加减运算是否发生溢出?写出溢出判别逻辑表达式。
(1)对于加法运算,当发生进位即CF=1时,表示发生溢出。对于减法运算不会发生溢出。
(2)溢出 = CF & Sub,其中Sub=1为减法,Sub=0为加法。
什么是无符号数?无符号数就是只表示非负整数(0、1、2、3……)的数,没有正负之分。例如,一个8位无符号数能表示的范围是0~255。
什么是溢出?当运算结果超出了数能表示的范围时,就叫"溢出"。比如:两个8位无符号数 200 + 100 = 300,但8位最多只能表示255,所以结果装不下,就溢出了。
什么是条件标志位?CPU在做完一次运算后,会自动设置一组"小旗子"(标志位)来记录运算结果的特征:
关键区分:CF vs OF——CF用来判断无符号数溢出,OF用来判断有符号数溢出,两者用途不同!本题问的是无符号数,所以重点关注CF。
什么是Sub信号?在加/减运算部件(ALU)中,有一个控制信号Sub来区分当前做的是加法还是减法:Sub=0表示加法,Sub=1表示减法。
第一步:理解无符号数加法为什么会溢出
两个n位无符号数相加,结果最大可能需要n+1位来存储。例如:8位最大值 11111111(255)+ 11111111(255)= 1_11111110(510),结果变成了9位。那个多出来的最高位"1"就是进位(Carry),此时CF=1。由于我们只有n位的空间存放结果,进位丢失,结果就错了——这就是溢出。
所以:无符号数加法溢出 ⟺ CF=1(产生了进位)。
第二步:理解无符号数减法为什么不会溢出
无符号数只能是非负整数。减法有两种情况:
因此:无符号数减法不会发生溢出。
第三步:写出溢出判别的逻辑表达式
我们需要一个表达式,仅在"做加法 且 CF=1"时输出溢出=1:
溢出 = CF · Sub
解读:
这个表达式完美地用一个与门(AND gate)实现了"加法看进位,减法不溢出"的判断逻辑。
口诀:"无符号溢出看CF,加法进位才算数"
第2章 数据的表示和运算 —— 加/减运算部件、条件标志位与溢出判断
简述MIPS指令系统中无条件跳转指令J的转移目标地址的形成过程。
将当前PC的高4位与指令中给出的26位直接地址拼接起来,在最后面添加两个"0"就得到了32位的跳转目标地址。
什么是MIPS?MIPS是一种经典的精简指令集(RISC)处理器架构,广泛用于教学。它的每条指令固定为32位长。
什么是PC(程序计数器)?PC是CPU中的一个寄存器,存放的是"下一条要执行的指令的地址"。CPU每执行完一条指令,PC就会更新,指向下一条指令。PC在MIPS中是32位的。
什么是跳转指令J?"J"是Jump(跳转)的缩写。它让程序不按顺序执行,而是"跳"到指定的目标地址去执行。J是无条件跳转,即不管任何条件,一定会跳。
J指令的格式:
| 操作码(6位) | 直接地址(26位) |
| 000010 | target(26位) |
一条32位指令中,6位给了操作码,只剩26位来放地址。但MIPS的地址空间是32位(能寻址4GB内存),26位不够,怎么办?这就需要一套巧妙的"地址拼接"方案。
核心问题:26位地址如何变成32位地址?
MIPS用了两个技巧来解决这个问题:
技巧一:利用字对齐,省掉最低2位
在MIPS中,每条指令固定4字节(32位),指令在内存中总是按4字节对齐存放。这意味着任何指令的地址一定是4的倍数,即地址的最低2位一定是"00"。既然一定是00,就不需要在指令中存储这2位,可以在计算时自动补上。
所以:26位实际上代表的是28位的地址信息(26位 + 自动补的2位"00")。
技巧二:利用PC高4位,补齐最高4位
28位还差4位才是32位。MIPS的做法是:取当前PC值的高4位来补齐。
为什么可以这样做?因为程序中的跳转通常不会跳得太远,目标地址和当前地址大概率在同一个256MB的区域内(228 = 256MB),高4位相同。
完整的拼接过程(从高位到低位):
| PC[31:28] (高4位) |
指令中的target (26位) |
00 (低2位补零) |
| 4位 | 26位 | 2位 |
| 合计:4 + 26 + 2 = 32位(完整目标地址) | ||
举例说明:
假设当前PC = 0x00400000(即 0000 0000 0100 0000 0000 0000 0000 0000),指令中的26位target = 00_0000_0000_0001_0000_0000_01
口诀:"高四拼二六,末尾补两零"
第3章 指令系统 —— MIPS指令格式与寻址方式(伪直接寻址)
简述微程序控制器中微命令的产生过程。
(1)将控制器所需的微命令以代码形式编成微指令,事先存入一个专门的存储器(控制存储器)。
(2)CPU执行程序时,从控制存储器中取出相应的微指令,产生所需要的各种微命令。
要理解微程序控制器,我们先从CPU如何执行指令说起。
CPU执行一条指令需要很多步骤:例如执行一条"加法指令",CPU内部需要依次完成:取指令→译码→取操作数→执行加法→写回结果。每一步都需要发出不同的"控制信号"来操控CPU内部的各个部件(如打开某个寄存器的门、让ALU做加法等)。
什么是微命令?微命令就是CPU内部最基本的控制信号。比如"打开寄存器A的输出门"、"让ALU执行加法"、"将数据写入寄存器B",这些都是微命令。一个时钟周期内可能需要同时发出多个微命令。
什么是微指令?把同一个时钟周期内需要同时发出的所有微命令打包在一起,再加上"下一条微指令的地址",就构成了一条微指令。
什么是微程序?完成一条机器指令功能所需的全部微指令按顺序排列起来,就是一段微程序。
什么是控制存储器(CM/CS)?控制存储器是CPU内部一个专门的只读存储器(ROM),用来存放所有的微指令。它不是普通的内存(主存),而是控制器内部的专用存储器。
形象比喻:把CPU执行指令比作演奏一首乐曲:微命令是单个音符,微指令是一个小节的乐谱,微程序是整首曲子的乐谱,控制存储器就是存放所有乐谱的曲谱本。
微命令的产生分为两个阶段:
阶段一:设计阶段——"编写乐谱"(事先完成)
在CPU设计制造时,工程师将每条机器指令的执行过程分解成一系列微操作步骤,把每一步需要的微命令用二进制代码编成微指令,存储到控制存储器(CM)中。这一步在CPU出厂前就完成了。
例如,"加法指令ADD"可能被分解为以下微指令序列:
阶段二:运行阶段——"照谱演奏"(执行时完成)
CPU运行程序时,每执行一条机器指令,就会从控制存储器中逐条取出对应的微指令。每条微指令被取出后,其中包含的微命令字段直接作为控制信号,送到CPU内部各个部件,驱动它们完成相应操作。
完整的工作流程:
口诀:"先编后取,存ROM取IR"
第4章 中央处理器 —— 微程序控制器的基本原理与工作过程
中断服务程序包含哪三个阶段?对于多重中断系统,这三个阶段分别是处于"开中断"还是"关中断"状态?
中断服务程序包含准备阶段、处理阶段和恢复阶段。准备阶段处于关中断状态,处理阶段处于开中断状态,恢复阶段处于关中断状态。
什么是中断?中断就像你正在做作业时,手机突然响了。你放下笔去接电话(处理中断),挂了电话后回来继续做作业(返回原程序)。CPU执行程序时也是如此——外部设备或内部异常可以"打断"CPU当前的工作,让CPU去处理紧急事件。
什么是中断服务程序?中断服务程序是专门用来处理中断事件的一段程序。当CPU响应中断后,就会跳转去执行中断服务程序。
什么是开中断和关中断?
什么是多重中断(中断嵌套)?多重中断是指在处理一个中断的过程中,又允许响应另一个更高优先级的中断。就像你接电话时,老板打来了更紧急的电话,你可以先挂掉当前电话去接老板的电话。
中断服务程序的三个阶段:
一、准备阶段(关中断状态)
这个阶段做的事情:
为什么要关中断?保存现场的过程必须是"一气呵成"的。如果保存到一半被另一个中断打断了,寄存器的值可能被新的中断修改,回来就无法正确恢复了。这就像搬家时打包东西,如果打包到一半被人把东西拿走了,到了新家就会发现少了东西。
二、处理阶段(开中断状态)
这个阶段做的事情:
为什么要开中断?这就是"多重中断"的关键!开中断后,如果有更高优先级的中断请求来了,CPU可以暂停当前中断处理,去响应更紧急的中断。这样可以保证紧急事件得到及时处理,提高系统的实时响应能力。
三、恢复阶段(关中断状态)
这个阶段做的事情:
为什么要关中断?与准备阶段同理,恢复现场的过程也必须是完整的、不可打断的。如果恢复到一半被打断,CPU的状态就会混乱,程序就无法正确继续执行了。
总结对应关系:
| 阶段 | 中断状态 | 原因 |
|---|---|---|
| 准备阶段(保存现场) | 关中断 | 保护现场不被破坏 |
| 处理阶段(执行处理) | 开中断 | 允许更高优先级中断 |
| 恢复阶段(恢复现场) | 关中断 | 保护恢复过程不被打断 |
口诀:"关-开-关,准处恢"
第6章 互连及输入输出组织 —— 中断系统与多重中断处理
将十进制数67.375转换成IEEE754的32位标准浮点数的二进制格式,并写出其16进制数格式。
符号位S=0,整数部分:67为1000011,小数部分.375:011
67.375 = 1000011.011 = 1.000011011 × 26,阶码为6
移码E = 6 + 127 = 133 = 10000101B
最后二进制为:0 10000101 000011011000000000000000
十六进制表示:4286C000H
什么是IEEE 754?
IEEE 754是国际上统一的浮点数表示标准。我们日常用的小数(如67.375),在计算机中需要用二进制来存储。IEEE 754规定了一种32位(单精度)的存储格式:
| 1位符号位(S) | 8位阶码(E) | 23位尾数(M) |
| 第31位 | 第30~23位 | 第22~0位 |
转换的总体思路:先把十进制数转换成二进制,再用科学计数法表示,最后按照S、E、M三部分填入32位格式。
第一步:判断符号位
67.375 是正数,所以符号位 S = 0
第二步:将整数部分67转换为二进制
方法:"除2取余,逆序排列"——反复除以2,记录余数,最后把余数从下往上排列。
67 ÷ 2 = 33 ... 余 1
33 ÷ 2 = 16 ... 余 1
16 ÷ 2 = 8 ... 余 0
8 ÷ 2 = 4 ... 余 0
4 ÷ 2 = 2 ... 余 0
2 ÷ 2 = 1 ... 余 0
1 ÷ 2 = 0 ... 余 1
从下往上读余数:1000011
验证:1×64 + 0×32 + 0×16 + 0×8 + 0×4 + 1×2 + 1×1 = 64+2+1 = 67 ✓
第三步:将小数部分0.375转换为二进制
方法:"乘2取整,顺序排列"——反复乘以2,记录整数部分,取走整数部分后继续。
0.375 × 2 = 0.75 → 取整数部分 0
0.75 × 2 = 1.5 → 取整数部分 1
0.5 × 2 = 1.0 → 取整数部分 1
小数变为0,结束。顺序排列:011
验证:0×0.5 + 1×0.25 + 1×0.125 = 0.25+0.125 = 0.375 ✓
第四步:合并整数和小数部分
67.375(十进制)= 1000011.011(二进制)
第五步:写成二进制科学计数法(规格化)
把小数点移到第一个"1"的后面:
1000011.011 = 1.000011011 × 26
↑小数点左移了6位,所以指数为6
第六步:计算阶码E(移码表示)
IEEE 754规定:阶码 = 真实指数 + 127(偏移量)
E = 6 + 127 = 133
将133转为8位二进制:
133 ÷ 2 = 66 ... 余 1
66 ÷ 2 = 33 ... 余 0
33 ÷ 2 = 16 ... 余 1
16 ÷ 2 = 8 ... 余 0
8 ÷ 2 = 4 ... 余 0
4 ÷ 2 = 2 ... 余 0
2 ÷ 2 = 1 ... 余 0
1 ÷ 2 = 0 ... 余 1
从下往上读:10000101
第七步:确定尾数M
科学计数法为 1.000011011 × 26,去掉开头的"1.",取小数部分:
000011011,后面补0至23位:00001101100000000000000
第八步:组合成32位二进制
S(1位) E(8位) M(23位)
0 10000101 00001101100000000000000
完整:0 10000101 00001101100000000000000
= 0100 0010 1000 0110 1100 0000 0000 0000
第九步:转换为十六进制
每4位二进制对应1位十六进制:
0100 → 4
0010 → 2
1000 → 8
0110 → 6
1100 → C
0000 → 0
0000 → 0
0000 → 0
结果:4286C000H
第2章 数据的表示和运算 —— IEEE 754浮点数标准、进制转换
一个高级语言编写的程序被两个不同的编译器编译生成两种不同的指令序列F1和F2,在时钟频率为1GHz的机器上运行,目标指令序列中用到的指令类型有A、B、C和D四类。四类指令在机器上的CPI和两个指令序列所用的各类指令条数如下表所示。
| 指令类型 | A | B | C | D |
|---|---|---|---|---|
| 各类指令的CPI | 1 | 2 | 3 | 4 |
| F1的指令条数 | 3 | 3 | 4 | 2 |
| F2的指令条数 | 4 | 3 | 2 | 2 |
试回答以下各问:
(1)F1和F2各有多少条指令?所含的时钟周期数各为多少?
(2)F1和F2的CPI各为多少?执行时间各为多少?
要求:小数保留到小数点后1位。
(1)F1:有3+3+4+2=12条指令,时钟周期数为1×3+2×3+3×4+4×2=29
F2:有4+3+2+2=11条指令,时钟周期数为1×4+2×3+3×2+4×2=24
(2)F1:CPI为29/12≈2.4,执行时间为29/1G=29ns
F2:CPI为24/11≈2.2,执行时间为24/1G=24ns
什么是CPI、时钟频率和执行时间?
关键公式:
指令条数 = 各类指令条数之和
总时钟周期数 = Σ (每类指令的CPI × 该类指令条数)
平均CPI = 总时钟周期数 / 总指令条数
执行时间 = 总时钟周期数 / 时钟频率
第(1)小问:指令条数和时钟周期数
计算F1的指令条数:
把四类指令的条数加起来:
F1指令条数 = 3(A类)+ 3(B类)+ 4(C类)+ 2(D类)= 12条
计算F1的总时钟周期数:
每类指令的"CPI × 条数"再求和:
A类贡献:CPI=1 × 3条 = 3个周期
B类贡献:CPI=2 × 3条 = 6个周期
C类贡献:CPI=3 × 4条 = 12个周期
D类贡献:CPI=4 × 2条 = 8个周期
───────────────────────────
总周期数 = 3 + 6 + 12 + 8 = 29个周期
计算F2的指令条数:
F2指令条数 = 4(A类)+ 3(B类)+ 2(C类)+ 2(D类)= 11条
计算F2的总时钟周期数:
A类贡献:CPI=1 × 4条 = 4个周期
B类贡献:CPI=2 × 3条 = 6个周期
C类贡献:CPI=3 × 2条 = 6个周期
D类贡献:CPI=4 × 2条 = 8个周期
───────────────────────────
总周期数 = 4 + 6 + 6 + 8 = 24个周期
第(2)小问:CPI和执行时间
计算平均CPI:
公式:平均CPI = 总时钟周期数 / 总指令条数
F1的CPI = 29 / 12 ≈ 2.4
F2的CPI = 24 / 11 ≈ 2.2
计算执行时间:
公式:执行时间 = 总时钟周期数 / 时钟频率
时钟频率 = 1GHz = 109Hz,即每秒109个周期
F1的执行时间 = 29 / 109 = 29 × 10-9秒 = 29ns
F2的执行时间 = 24 / 109 = 24 × 10-9秒 = 24ns
结论:F2比F1更快(24ns < 29ns),虽然F2用了更多的A类指令(CPI=1),但减少了C类指令(CPI=3)的使用,总体周期数更少,所以执行更快。编译器F2的优化效果更好。
第1章 计算机系统概述 —— 计算机性能指标(CPI、MIPS、执行时间等)
设有两个8位补码数:A=01001001,B=10111010,用加法指令ADD执行A+B的操作,指令执行后的8位结果以及标志位ZF(零)、CF(进位/借位)、OF(溢出)和SF(符号)分别是多少?
A+B = 01001001 + 10111010 = 00000011
ZF=0,CF=1,OF=0,SF=0
什么是补码?
补码是计算机中表示有符号整数的方式。对于8位补码:
四个标志位的含义:
第一步:确认A和B代表的十进制值
A = 01001001(补码),最高位为0,是正数
A = 0×128 + 1×64 + 0×32 + 0×16 + 1×8 + 0×4 + 0×2 + 1×1 = 64+8+1 = +73
B = 10111010(补码),最高位为1,是负数
求B的真值:取反加1 → 01000101 + 1 = 01000110 = 70,所以B = -70
A + B = 73 + (-70) = +3,在-128~127范围内,不会溢出。
第二步:逐位二进制加法
进位: 1 1 1 1 1 0 0 0
0 1 0 0 1 0 0 1 (A = +73)
+ 1 0 1 1 1 0 1 0 (B = -70)
─────────────────────
1 0 0 0 0 0 0 1 1
↑
第9位进位=1 8位结果=00000011
让我们逐位验算(从右往左,最低位是第0位):
第0位:1 + 0 = 1,进位0
第1位:0 + 1 = 1,进位0
第2位:0 + 0 = 0,进位0
第3位:1 + 1 = 10,写0进1
第4位:0 + 1 + 进位1 = 10,写0进1
第5位:0 + 1 + 进位1 = 10,写0进1
第6位:1 + 0 + 进位1 = 10,写0进1 ← 次高位进位C6=1
第7位:0 + 1 + 进位1 = 10,写0进1 ← 最高位进位C7=1
8位结果:00000011(即十进制3,验证正确!)
第三步:判断各标志位
ZF(零标志):
结果 = 00000011 ≠ 00000000,结果不为零
所以 ZF = 0
SF(符号标志):
结果最高位 = 0(结果00000011的第7位是0)
所以 SF = 0(表示结果为正数)
CF(进位标志):
最高位(第7位)相加后向第8位产生了进位(C7=1)
所以 CF = 1
(注意:CF=1并不代表有符号运算出错,CF主要用于无符号数运算的判断。对于有符号数,看OF。)
OF(溢出标志):
判断方法:OF = C7 ⊕ C6(最高位进位 异或 次高位进位)
C7 = 1(最高位进位),C6 = 1(次高位进位)
OF = 1 ⊕ 1 = 0(没有溢出)
直观验证:一正一负相加,不可能溢出!(溢出只可能在两个同号数相加时发生)
第2章 数据的表示和运算 —— 补码运算、标志位判断
某计算机字长16位,采用16位定长指令格式,部分数据通路结构如题33图所示。假设MAR的输出一直处于使能状态。对于指令 SUB (R4), R1,试分别列出每个时序节拍所需有效控制信号和所完成的功能。
注:该指令功能为 M[R[R4]] ← M[R[R4]] - R[R1]
数据通路包含以下组件和控制信号:指令译码/控制器、IR(指令寄存器)、PC(程序计数器)、MAR(MARin控制信号)、MDR(MDRin/MDRout控制信号)、存储器(MemR/MemW控制信号)、R1(R1out/R1in)、R2(R2out/R2in)、Y(Yin)、ALU(A端和B端,ADD/SUB/1→Ce等控制信号)、Z(Zout),各组件通过总线连接。
| 节拍 | 控制信号 | 功能 |
|---|---|---|
| T1 | R4out, MARin | MAR ← (R4) |
| T2 | MemR | MDR ← M(MAR) |
| T3 | MDRout, Yin | Y ← (MDR) |
| T4 | R1out, SUB | Z ← Y - (R1) |
| T5 | Zout, MDRin | MDR ← (Z) |
| T6 | MemW | M(MAR) ← (MDR) |
什么是数据通路?
数据通路是CPU中数据流动的路径,由寄存器、ALU、总线等组件通过控制信号连接而成。每一个时钟节拍,控制器发出一组控制信号,让数据沿着特定路径流动,完成一个微操作。
关键组件的作用:
指令含义解读:SUB (R4), R1
M[R[R4]] ← M[R[R4]] - R[R1] 的含义:
数据通路示意图:
┌──────────┐
│ 指令译码/ │
│ 控制器 │──→ 各种控制信号
└──────────┘
│
═══════════════════════════════════════ 内部总线
║ ║ ║ ║ ║ ║ ║
┌──┐ ┌──┐ ┌──┐ ┌───┐ ┌───┐ ┌──┐ ┌──┐
│PC│ │IR│ │R1│ │R2 │ │R4 │ │Y │ │Z │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
└──┘ └──┘ └──┘ └───┘ └───┘ └──┘ └──┘
│ │
↓ ↑
┌──────────┐
│ ALU │
│ A端 B端 │
└──────────┘
(A端←Y, B端←总线)
┌─────┐ ┌─────┐
│ MAR │──→ 地址总线 ──→ │存储器│
└─────┘ │ │
┌─────┐ │ │
│ MDR │←─→ 数据总线 ←─→ │ │
└─────┘ └─────┘
指令 SUB (R4), R1 的功能是 M[R[R4]] ← M[R[R4]] - R[R1],需要完成以下步骤:
节拍T1:将R4的值送入MAR(获取内存地址)
控制信号:R4out, MARin
功能:MAR ← (R4)
数据流向:R4 ──→ 总线 ──→ MAR
说明:R4out使R4的内容输出到总线上,MARin使MAR从总线上
接收数据。这一步把R4中保存的内存地址送到MAR,准备访问内存。
节拍T2:从内存中读取数据(读出被减数)
控制信号:MemR
功能:MDR ← M(MAR)
数据流向:存储器[MAR指向的地址] ──→ MDR
说明:MemR发出存储器读命令。存储器根据MAR中的地址,
找到对应的存储单元,将其中的数据通过数据总线送入MDR。
此时MDR中存放的就是被减数。
节拍T3:将被减数暂存到Y寄存器
控制信号:MDRout, Yin
功能:Y ← (MDR)
数据流向:MDR ──→ 总线 ──→ Y
说明:为什么需要Y寄存器?因为ALU需要两个输入(A端和B端),
但总线在同一时刻只能传一个数据。所以先把被减数存到Y(连接
ALU的A端),下一步再把减数通过总线送到ALU的B端。
节拍T4:执行减法运算
控制信号:R1out, SUB
功能:Z ← Y - (R1)
数据流向:R1 ──→ 总线 ──→ ALU B端
Y ──→ ALU A端
ALU输出 ──→ Z
说明:R1out让R1的值(减数)输出到总线,送入ALU的B端。
SUB信号让ALU执行减法操作:A端(Y中的被减数) - B端(R1中的减数)。
运算结果自动存入Z寄存器。
节拍T5:将运算结果送入MDR
控制信号:Zout, MDRin
功能:MDR ← (Z)
数据流向:Z ──→ 总线 ──→ MDR
说明:把ALU的运算结果从Z寄存器取出,通过总线送入MDR,
为下一步写回内存做准备。
注意:MAR中仍然保存着之前的地址(第T1步存入的),
所以不需要重新设置MAR。
节拍T6:将结果写回内存
控制信号:MemW
功能:M(MAR) ← (MDR)
数据流向:MDR ──→ 数据总线 ──→ 存储器[MAR指向的地址]
说明:MemW发出存储器写命令。存储器将MDR中的运算结果,
写入MAR所指向的内存地址中。至此,指令执行完毕。
完整数据流程总结:
T1: R4 → MAR (取地址)
T2: 内存[MAR] → MDR (读被减数)
T3: MDR → Y (暂存被减数到ALU输入端)
T4: Y - R1 → Z (执行减法,结果存Z)
T5: Z → MDR (结果准备写回)
T6: MDR → 内存[MAR] (写回内存)
第4章 中央处理器 —— 数据通路结构、微操作与控制信号
假定主存与Cache之间采用2路组相联映射方式,数据块大小为1K字节,Cache数据区容量为16K字节,主存空间大小为2M字节,按字节编址。试回答以下各问:
(1)主存地址划分为哪几个部分?每个部分分别是哪几位地址?
(2)Cache总容量是多少?(包含有效位V)
(3)主存单元地址12345H映射到Cache的哪一组?
(1)主存空间2M字节=221字节,故主存地址有21位。Cache有16K/1K=16行,每2行为1组,共有16/2=8组,故组号需3位表示。
主存地址划分为块内地址、组号和标记三个部分:
块内地址10位:A9~A0
Cache组号3位:A12~A10
标记 21-10-3=8位:A20~A13
(2)Cache总容量 = 16KB +(8+1)bit × 16 = 16KB + 18B = 16402B = 131216bit
(3)12345H =(0001 0010 0011 0100 0101)二进制
其中,组号A12~A10为000,所以映射到第0组。
什么是Cache?
Cache(高速缓存)是位于CPU和主存之间的小容量高速存储器。因为CPU速度远快于主存,Cache存放主存中最常用的数据副本,让CPU大部分时候能快速获取数据。
什么是"组相联映射"?
组相联映射是Cache与主存之间的一种地址映射方式,是"直接映射"和"全相联映射"的折中方案:
"2路组相联"意味着每组有2行(2路),主存块映射到固定组后,可以放在该组的2行中的任意一行。
主存地址的划分:
┌──────────┬──────────┬───────────┐
│ 标记Tag │ 组号Set │ 块内地址 │
│ (高位) │ (中间位) │ (低位) │
└──────────┴──────────┴───────────┘
用于比较 确定放在 确定块内
是否命中 哪一组 第几个字节
第(1)小问:主存地址划分
步骤1:确定主存地址总位数
主存空间 = 2M字节 = 2 × 1024 × 1024 = 2 × 220 = 221 字节
每个字节需要一个唯一地址,所以需要 21位 地址(因为221个地址需要21位二进制表示)
步骤2:确定块内地址位数
数据块大小 = 1K字节 = 1024 = 210 字节
块内有210个字节需要编址,所以块内地址需要 10位(A9~A0)
步骤3:确定组号位数
Cache数据区容量 = 16K字节
Cache总行数 = 16K / 1K = 16行
2路组相联 → 每组2行 → 总组数 = 16 / 2 = 8组
8 = 23,所以组号需要 3位(A12~A10)
步骤4:确定标记位数
标记位数 = 总地址位数 - 组号位数 - 块内地址位数
标记位数 = 21 - 3 - 10 = 8位(A20~A13)
地址划分示意图:
21位主存地址:
┌─────────────┬───────────┬──────────────────┐
│ 标记(Tag) │ 组号(Set) │ 块内地址(Offset) │
│ A20 ~ A13 │ A12 ~ A10 │ A9 ~ A0 │
│ 8位 │ 3位 │ 10位 │
└─────────────┴───────────┴──────────────────┘
第(2)小问:Cache总容量
Cache总容量 = 数据区容量 + 额外开销(标记位 + 有效位)
数据区容量 = 16KB(题目已给)
额外开销(每行都需要的附加信息):
总共16行的额外开销 = 9 bit × 16 = 144 bit = 18 字节
Cache总容量 = 16KB + 18B = 16384B + 18B = 16402字节 = 131216 bit
计算验证:16402 × 8 = 131216 bit ✓
第(3)小问:地址12345H映射到哪一组
步骤1:将十六进制地址转为二进制
12345H,每一位十六进制对应4位二进制:
1 → 0001
2 → 0010
3 → 0011
4 → 0100
5 → 0101
12345H = 0 0001 0010 0011 0100 0101(补到21位)
步骤2:按地址划分提取组号
将21位地址按照 标记(8位) | 组号(3位) | 块内地址(10位) 划分:
A20 A13 A12 A10 A9 A0
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
|←──── 标记 8位 ────→|←组号→|←────── 块内地址 10位 ──────→|
00001001 000 0110100101
步骤3:读取组号
组号 = A12 A11 A10 = 000(二进制)= 0(十进制)
所以主存单元地址12345H映射到Cache的第0组。
第5章 存储器层次结构 —— Cache的映射方式(直接映射、组相联、全相联)