在IEEE754浮点数标准中规定
A. 尾数为原码,阶码为补码
B. 尾数为原码,阶码为移码
C. 尾数为补码,阶码为移码
D. 尾数为补码,阶码为补码
IEEE 754是国际通用的浮点数表示标准,广泛用于现代计算机中。浮点数由三个部分组成:符号位(S)、阶码(Exponent)和尾数(Mantissa/Significand)。以32位单精度为例,格式为:1位符号位 + 8位阶码 + 23位尾数。尾数部分采用原码表示,即用符号位表示正负,尾数的数值部分直接存储;同时尾数采用隐含的"1.M"形式(规格化),即小数点前面隐含一个1,不需要额外存储。阶码部分采用移码(也称偏置码/Biased Exponent)表示,即在真实的指数值上加一个固定的偏移量(单精度偏移量为127,双精度为1023),使得阶码始终为非负整数,便于比较大小。
A. 尾数为原码,阶码为补码 尾数为原码是正确的,但阶码不是补码,而是移码。补码常用于整数的表示,不适用于IEEE 754的阶码。此选项错误。
B. 尾数为原码,阶码为移码 完全正确。IEEE 754标准明确规定尾数用原码表示(符号位单独存放,尾数数值部分直接表示),阶码用移码(偏置码)表示,偏移量为2^(k-1)-1,其中k为阶码位数。这是本题的正确答案。
C. 尾数为补码,阶码为移码 阶码为移码是正确的,但尾数不是补码。IEEE 754中尾数的符号位独立存放在最高位,尾数数值部分直接以原码形式存储,不存在取反加一的补码操作。此选项错误。
D. 尾数为补码,阶码为补码 尾数和阶码的编码方式都不正确。补码主要用于定点整数的表示,IEEE 754标准并未采用这种方案。此选项错误。
口诀:"尾原阶移"——尾数用原码,阶码用移码。移码的好处是方便比较指数大小(全部变成非负数,直接比较即可);原码的好处是尾数的表示更直观。可以这样联想:IEEE 754的设计目标之一是让浮点数的大小比较尽可能简单,所以阶码用移码使得高位优先比较时自然有序。
袁春风《计算机组成原理》第2章"数据的表示和运算"中关于IEEE 754浮点数标准的内容,详细讲解了浮点数的格式、阶码的移码表示以及尾数的原码表示。
表示计算机性能的指标CPI是指
A. 一条指令执行的时间
B. 一条指令执行的时钟频率
C. 一条指令执行的时钟周期数
D. 一条指令包含的字节数
CPI是Cycles Per Instruction的缩写,中文意为"每条指令的时钟周期数"。它是衡量计算机性能的重要指标之一。计算机的CPU执行每条指令都需要若干个时钟周期,不同类型的指令所需的时钟周期数可能不同。例如,一条加法指令可能需要1个时钟周期,而一条乘法指令可能需要3个时钟周期。CPI可以表示单条指令的周期数,也可以表示一个程序中所有指令的平均时钟周期数。CPU执行时间的计算公式为:CPU执行时间 = 指令条数 × CPI × 时钟周期时间 = 指令条数 × CPI / 时钟频率。
A. 一条指令执行的时间 一条指令执行的时间通常用"指令执行时间"来表示,等于CPI × 时钟周期时间。这不是CPI本身的含义,CPI只是周期数,还需要乘以每个周期的时间才能得到执行时间。此选项错误。
B. 一条指令执行的时钟频率 时钟频率是指CPU每秒产生的时钟脉冲数,单位为Hz,它是CPU本身的固有参数,与单条指令无关。这个概念与CPI完全不同。此选项错误。
C. 一条指令执行的时钟周期数 正确。CPI的英文全称为Cycles Per Instruction,直译就是"每条指令所需的时钟周期数"。CPI越小,说明执行每条指令所需的时钟周期越少,CPU的效率越高。
D. 一条指令包含的字节数 指令的字节数描述的是指令的长度(指令字长),与指令执行效率无关,也不是CPI的含义。此选项错误。
CPI = Cycles Per Instruction,直接从英文缩写记忆:C=Cycles(周期),P=Per(每),I=Instruction(指令),即"每条指令的周期数"。与之配套记忆的还有:MIPS(每秒执行百万条指令数)= 主频 / (CPI × 10^6),CPU时间 = 指令数 × CPI × 时钟周期。
袁春风《计算机组成原理》第1章"计算机系统概述"中关于计算机性能评价指标的内容,详细介绍了CPI、MIPS、主频等性能指标及其相互关系。
在计算机系统的层次化结构中ISA描述的是
A. 系统管理员如何管理计算机的资源
B. 应用程序员如何编写应用程序
C. 高级语言程序如何翻译成机器语言程序
D. 计算机软件如何在硬件上执行
ISA是Instruction Set Architecture的缩写,中文称为"指令集体系结构"或"指令系统架构"。在计算机系统的层次化结构中,ISA处于软件和硬件之间的交界面,是软件和硬件之间的接口规范。ISA定义了一台计算机能够执行的所有指令的集合、指令格式、操作类型、数据类型、寻址方式、寄存器组织、中断机制、I/O方式、存储保护等内容。它规定了软件如何使用硬件的资源来完成各种操作,是软件在硬件上执行的桥梁。程序员编写的程序最终要翻译成ISA层的机器指令才能被硬件执行。
A. 系统管理员如何管理计算机的资源 系统管理属于操作系统层面的功能,与ISA无直接关系。操作系统是运行在ISA之上的系统软件,而不是ISA本身。此选项错误。
B. 应用程序员如何编写应用程序 应用程序员通常使用高级语言编写程序,工作在高级语言层或应用层,不直接面对ISA。ISA面向的是系统程序员和编译器设计者。此选项错误。
C. 高级语言程序如何翻译成机器语言程序 高级语言翻译成机器语言是编译器的工作,属于编译原理的范畴。编译器在翻译时需要使用ISA定义的指令集,但ISA本身不描述翻译过程。此选项错误。
D. 计算机软件如何在硬件上执行 正确。ISA正是软件和硬件之间的界面(接口),它定义了硬件提供给软件使用的功能和规范。通过ISA,软件知道硬件能执行哪些操作,硬件知道需要支持哪些功能,从而实现软件在硬件上的正确执行。
ISA = 软硬件之间的接口/界面。记住"ISA是软件和硬件之间的桥梁"这句话即可。ISA向上为软件提供编程接口,向下规定硬件需要实现的功能。它回答的核心问题就是"软件如何在硬件上运行"。
袁春风《计算机组成原理》第1章"计算机系统概述"中关于计算机系统层次结构的内容,明确指出ISA是软件和硬件的交界面,定义了软件如何在硬件上执行。
设有十六进制数123456H,若字节存储单元地址从小到大表示为从左到右的顺序,采用大端方式存储的各字节存储单元内容排列顺序是
A. 12H, 34H, 56H
B. 34H, 12H, 56H
C. 56H, 34H, 12H
D. 56H, 12H, 34H
在计算机中,多字节数据在内存中存放有两种方式:大端方式(Big-Endian)和小端方式(Little-Endian)。大端方式是指数据的最高有效字节(Most Significant Byte, MSB)存放在低地址单元,最低有效字节(Least Significant Byte, LSB)存放在高地址单元。小端方式则相反,最低有效字节存放在低地址单元,最高有效字节存放在高地址单元。对于十六进制数123456H,它由三个字节组成:12H(最高字节)、34H(中间字节)、56H(最低字节)。
A. 12H, 34H, 56H 正确。大端方式将最高有效字节12H存放在最低地址(最左边),然后依次是34H、56H。即从左到右(地址从小到大),排列为12H, 34H, 56H,与数据书写顺序一致。这就是大端方式的特点——"高字节在低地址"。
B. 34H, 12H, 56H 这种排列方式没有遵循任何标准的字节序规则,既不是大端也不是小端。此选项错误。
C. 56H, 34H, 12H 这是小端方式的存储顺序。小端方式将最低有效字节56H放在最低地址(最左边),最高有效字节12H放在最高地址(最右边)。题目问的是大端方式,故此选项错误。
D. 56H, 12H, 34H 这种排列方式同样没有遵循标准的字节序规则。此选项错误。
大端方式 = "大头在前",即高位字节(大的一端)存在低地址(前面)。可以这样记忆:大端存储的顺序与我们人类书写数字的习惯一致——先写高位再写低位。小端则相反,"小头在前",低位字节在前。口诀:"大端高低,小端低低"——大端方式高字节在低地址,小端方式低字节在低地址。
袁春风《计算机组成原理》第2章"数据的表示和运算"中关于数据的存储和排列的内容,详细讲解了大端和小端两种字节序的存储方式及其区别。
指令的操作数在寄存器中的寻址方式是
A. 直接寻址
B. 寄存器直接寻址
C. 寄存器间接寻址
D. 间接寻址
寻址方式是指CPU根据指令中给出的地址信息来寻找操作数的方法。不同的寻址方式决定了操作数的来源不同。常见的寻址方式包括:立即寻址(操作数直接在指令中)、直接寻址(指令给出操作数的内存地址)、间接寻址(指令给出的地址指向的内存单元中存放的是操作数的地址)、寄存器直接寻址(操作数在寄存器中)、寄存器间接寻址(寄存器中存放的是操作数的内存地址)等。关键区别在于:操作数本身在哪里?是在指令中、在内存中、还是在寄存器中?
A. 直接寻址 直接寻址是指指令中直接给出操作数在主存中的地址,操作数在主存中,不在寄存器中。题目说"操作数在寄存器中",所以这不是直接寻址。此选项错误。
B. 寄存器直接寻址 正确。寄存器直接寻址(也简称寄存器寻址)是指指令中的地址码给出的是寄存器编号,操作数就在该寄存器中。这完全符合题意"操作数在寄存器中"。这种寻址方式速度最快,因为不需要访问主存。
C. 寄存器间接寻址 寄存器间接寻址是指寄存器中存放的不是操作数本身,而是操作数在主存中的地址。也就是说,操作数实际上在主存中,寄存器只是提供了一个地址指针。这与题意"操作数在寄存器中"不符。此选项错误。
D. 间接寻址 间接寻址是指指令中给出的是操作数地址的地址(在主存中),需要两次访问主存才能取到操作数。操作数在主存中,与寄存器无关。此选项错误。
区分"直接"和"间接"的关键:"直接"表示给出的信息直接就能找到操作数,"间接"表示给出的信息是操作数地址的地址,需要多一步间接寻找。寄存器直接寻址 = 操作数就在寄存器里(直接拿来用);寄存器间接寻址 = 寄存器里放的是地址(还需要去内存里找)。简单口诀:"直接在,间接指"——直接寻址操作数"在"那里,间接寻址只是"指"向那里。
袁春风《计算机组成原理》第3章"指令系统"中关于操作数寻址方式的内容,系统介绍了各种寻址方式的定义、特点和区别。
两个无符号数比较,"大于"的判断条件标志是
A. CF=0
B. CF=1
C. CF=0且ZF=0
D. CF=1且ZF=1
在CPU中,比较两个数的大小通常通过执行减法操作(A - B)来实现,但不保存减法结果,只根据运算结果设置标志位。常用的标志位有:CF(Carry Flag,进位/借位标志),当无符号数运算产生进位或借位时CF=1;ZF(Zero Flag,零标志),当运算结果为零时ZF=1。对于无符号数A和B的比较(执行A - B操作):若A > B,则A - B > 0,无借位(CF=0),结果不为零(ZF=0);若A = B,则A - B = 0,无借位(CF=0),结果为零(ZF=1);若A < B,则A - B < 0,产生借位(CF=1)。
A. CF=0 CF=0只表示没有借位,即A ≥ B(大于或等于)。但这包含了A = B的情况,不能精确判断"大于"。此选项不够精确,错误。
B. CF=1 CF=1表示产生了借位,即A < B(A小于B),这是"小于"的判断条件,与"大于"相反。此选项错误。
C. CF=0且ZF=0 正确。CF=0表示没有借位(A ≥ B),ZF=0表示结果不为零(A ≠ B),两个条件同时满足就意味着A > B(严格大于)。这是判断无符号数"大于"的完整条件。
D. CF=1且ZF=1 CF=1表示A < B,ZF=1表示结果为零(A = B),这两个条件在正常情况下不可能同时成立(如果A < B,那么A - B不可能为零)。此选项逻辑矛盾,错误。
无符号数比较的标志位判断,核心是理解减法操作A - B的结果:大于需要同时满足"没有借位"和"结果非零"两个条件。可以用排除法记忆:CF=0排除了小于的情况,ZF=0排除了等于的情况,剩下的就只有大于了。简记:"无借非零则大于"——没有借位(CF=0)且结果非零(ZF=0)就是大于。
袁春风《计算机组成原理》第3章"指令系统"或第4章"中央处理器"中关于标志位和条件转移指令的内容,讲解了CF、ZF等标志位在无符号数和有符号数比较中的应用。
总线带宽是指
A. 总线中数据线的条数
B. 总线中数据线和控制线的条数
C. 总线的最大数据传输率
D. 总线的最大时钟频率
总线(Bus)是计算机系统中各部件之间传输数据的公共通道。总线的性能指标有多个,包括:总线宽度(数据线的条数,决定一次能传输多少位数据)、总线频率(时钟频率,即总线每秒的工作周期数)、总线带宽(Bus Bandwidth,即总线的最大数据传输率,单位通常为MB/s或GB/s)。总线带宽的计算公式为:总线带宽 = 总线宽度 × 总线频率 / 8(如果总线宽度单位为位,带宽单位为字节/秒)。总线带宽综合反映了总线的数据传输能力。
A. 总线中数据线的条数 数据线的条数是"总线宽度"(Bus Width),不是总线带宽。总线宽度只是影响带宽的因素之一。此选项错误。
B. 总线中数据线和控制线的条数 总线由数据线、地址线和控制线三部分组成,但把数据线和控制线的条数加在一起没有特定的技术含义,这不是任何标准的总线性能指标。此选项错误。
C. 总线的最大数据传输率 正确。总线带宽的定义就是总线在单位时间内能够传输的最大数据量,即最大数据传输率(Maximum Data Transfer Rate)。它综合考虑了总线宽度和总线频率,是衡量总线传输能力的核心指标。
D. 总线的最大时钟频率 最大时钟频率是"总线频率"或"总线时钟速率",它只是影响总线带宽的因素之一,不等于总线带宽本身。此选项错误。
"带宽"一词在网络和计算机领域通常都表示数据传输能力。可以类比水管:总线宽度相当于水管的粗细,总线频率相当于水流的速度,总线带宽则是单位时间内流过的水量(综合了粗细和速度)。记住公式:带宽 = 宽度 × 频率,带宽是最终的传输能力指标。
袁春风《计算机组成原理》第6章"互连及输入输出组织"中关于总线的性能指标的内容,详细定义了总线宽度、总线频率、总线带宽等概念及其相互关系。
CPU中的高速缓冲存储器采用的是
A. SRAM
B. DRAM
C. ROM
D. PROM
高速缓冲存储器(Cache)是位于CPU和主存之间的高速小容量存储器,用于缓解CPU和主存之间的速度差异。Cache需要具备极高的访问速度以匹配CPU的运行频率。存储器按照技术分类主要有:SRAM(Static Random Access Memory,静态随机存取存储器),利用触发器存储信息,速度快但成本高、集成度低;DRAM(Dynamic Random Access Memory,动态随机存取存储器),利用电容存储信息,需要定期刷新,速度较慢但成本低、集成度高;ROM(Read Only Memory,只读存储器),只能读不能写;PROM(Programmable ROM,可编程只读存储器),只能编程一次。
A. SRAM 正确。SRAM(静态随机存取存储器)采用触发器(通常为6管CMOS电路)存储每一位数据,不需要刷新操作,访问速度非常快(纳秒级),非常适合作为Cache使用。虽然SRAM的成本较高、集成度较低,但Cache的容量本身很小(通常为KB到MB级别),所以成本可以接受。
B. DRAM DRAM利用电容的充放电来存储数据,需要定期刷新以保持数据不丢失,访问速度比SRAM慢。DRAM通常用于构建主存(内存条),而不是Cache。此选项错误。
C. ROM ROM是只读存储器,数据一旦写入就不能修改。Cache需要频繁地读写数据(缓存来自主存的数据,并不断替换),所以ROM完全不适合用作Cache。此选项错误。
D. PROM PROM是可编程只读存储器,只能编程一次,之后就变成只读的了。与ROM类似,不适合用作需要频繁读写的Cache。此选项错误。
存储器层次结构中的对应关系:Cache用SRAM(快但贵,容量小),主存用DRAM(稍慢但便宜,容量大),辅存用磁盘/SSD(更慢但更便宜,容量更大)。口诀:"缓存静态(SRAM),主存动态(DRAM)"。SRAM的"S"可以联想为"Speed"(速度快),DRAM的"D"可以联想为"Delay"(有延迟,需要刷新)。
袁春风《计算机组成原理》第5章"存储器层次结构"中关于Cache存储器和半导体存储器分类的内容,明确指出Cache采用SRAM实现,主存采用DRAM实现。
下列各操作中不属于中断响应周期中完成的操作是
A. 关中断
B. 保护断点
C. 中断源识别
D. 中断处理
中断处理的完整过程可以分为几个阶段:中断请求、中断响应、中断处理(也叫中断服务)和中断返回。其中,中断响应周期是CPU在检测到中断请求后、进入中断服务程序之前所执行的一系列硬件操作,通常由硬件自动完成。中断响应周期中完成的主要操作包括:(1)关中断——防止在保存现场过程中被新的中断打断;(2)保护断点——将当前程序计数器PC的值(即断点地址)保存到栈或特定寄存器中,以便中断处理结束后能返回原程序继续执行;(3)中断源识别——确定是哪个设备发出的中断请求,并找到对应的中断服务程序入口地址。这些操作完成后,CPU才跳转到中断服务程序开始执行中断处理。
A. 关中断 关中断是中断响应周期中的第一步操作,由硬件自动完成,目的是禁止新的中断请求打断当前的中断响应过程。这属于中断响应周期的操作。此选项不符合题意。
B. 保护断点 保护断点是将当前的PC值(程序计数器的值)压入栈中或保存到特定寄存器,以便将来能返回到被中断的程序继续执行。这是中断响应周期中由硬件完成的关键操作。此选项不符合题意。
C. 中断源识别 中断源识别是确定哪个中断源发出了中断请求,并获取对应的中断服务程序的入口地址。这也是在中断响应周期中完成的操作(可以通过硬件向量法或软件查询法实现)。此选项不符合题意。
D. 中断处理 正确答案。中断处理(即执行中断服务程序)是在中断响应周期结束之后才进行的操作。中断服务程序由软件编写,包括保护现场、处理具体的中断事务、恢复现场等步骤。它不属于中断响应周期,而属于中断响应之后的中断服务阶段。
中断响应周期 = 硬件自动完成的准备工作,包括三步:"关、保、识"——关中断、保护断点、识别中断源。中断处理 = 软件执行的服务工作,即执行中断服务程序。区分的关键是:响应周期由硬件自动完成,中断处理由软件完成。口诀:"响应做准备(硬件),处理干活儿(软件)"。
袁春风《计算机组成原理》第6章"互连及输入输出组织"中关于中断系统的内容,详细讲解了中断响应周期的操作步骤以及中断处理的完整过程。
向量中断方式下产生中断服务程序入口地址的方法是
A. 由中断源直接给出
B. 从中断向量表中获得
C. 运行查询程序获得
D. 从中断服务程序中获得
在中断系统中,CPU需要知道应该跳转到哪个中断服务程序去处理中断请求。获取中断服务程序入口地址的方法主要有两种:软件查询法和向量中断法。软件查询法是通过依次查询各中断源的状态来确定中断源,进而确定服务程序入口地址,速度较慢。向量中断法是一种硬件方式:每个中断源对应一个中断向量号(中断类型号),CPU根据中断向量号在内存中的中断向量表(Interrupt Vector Table)中查找对应的中断服务程序入口地址。中断向量表是预先在内存的固定区域建立的一张表,表中存放的每一项就是一个中断服务程序的入口地址(即中断向量)。
A. 由中断源直接给出 中断源直接给出的是中断向量号(中断类型号),而不是中断服务程序的入口地址。中断向量号是一个编号,CPU需要根据这个编号去中断向量表中查找真正的入口地址。此选项错误。
B. 从中断向量表中获得 正确。向量中断方式的核心机制就是:中断源提供中断向量号 → CPU用向量号作为索引去中断向量表中查找 → 从表中取出对应的中断服务程序入口地址 → 跳转到该地址执行中断服务程序。中断向量表是预先建立好的,存放在内存的特定区域。
C. 运行查询程序获得 这是软件查询法(也称软件轮询法)的方式,通过程序依次查询各中断源的中断请求标志位来确定中断源和入口地址。这不是向量中断方式,而是另一种完全不同的方法。此选项错误。
D. 从中断服务程序中获得 中断服务程序的入口地址是在进入中断服务程序之前就需要确定的,不可能"从中断服务程序中获得"——这在逻辑上就说不通(还没进入服务程序,怎么从中获取地址?)。此选项错误。
向量中断的关键词是"向量表"。"向量"就是入口地址,"向量表"就是存放各中断服务程序入口地址的表。过程可以简记为:中断源给编号 → 编号查表 → 表中取地址 → 跳转执行。注意区分:中断源给出的是"向量号"(编号),不是入口地址;入口地址是从"向量表"中获取的。
袁春风《计算机组成原理》第6章"互连及输入输出组织"中关于中断识别方式的内容,对比讲解了软件查询法和向量中断法,详细介绍了中断向量表的结构和工作原理。
IEEE754浮点数标准中,规格化尾数的隐藏位取值为______,非规格化尾数的隐藏位取值为______。
IEEE 754是国际通用的浮点数表示标准,它规定了浮点数在计算机中的存储格式。一个IEEE 754浮点数由三部分组成:符号位(S)、阶码(E,即指数部分)和尾数(M,即有效数字部分)。为了提高精度,IEEE 754采用了"隐藏位"技术——即尾数的最高有效位不显式存储在内存中,而是隐含约定。
规格化数(Normalized Number):当阶码E既不全为0也不全为1时,该浮点数为规格化数。规格化数的尾数采用"1.M"的形式表示,即小数点前面隐含一个"1"。这个隐含的"1"就是隐藏位,它不占用存储空间,但参与计算。因此,规格化尾数的隐藏位取值为1。例如,单精度浮点数虽然只存储了23位尾数,但实际有效精度为24位(1位隐藏位 + 23位显式尾数)。
非规格化数(Denormalized Number):当阶码E全为0时,该浮点数为非规格化数。非规格化数的尾数采用"0.M"的形式表示,即小数点前面隐含一个"0"。这个隐含的"0"就是隐藏位,取值为0。非规格化数的作用是表示非常接近0的极小数值,填补了0和最小规格化数之间的空隙,实现了"渐进式下溢"(gradual underflow)。
口诀:"规格化隐1,非规格化隐0"。规格化数追求精度,隐含的1使得有效位多一位;非规格化数追求范围,用隐含的0表示极小值。可以联想:规格化数是"正常"的数,所以隐藏位取"正常"的1;非规格化数是"特殊"的极小数,隐藏位为0以保证与0之间的平滑过渡。
第2章"数据的表示和运算"——IEEE 754浮点数标准部分,涉及规格化与非规格化浮点数的表示方法。
MIPS指令格式中指令长度为______位,操作码OP长度为______位。
MIPS(Microprocessor without Interlocked Pipeline Stages)是一种经典的RISC(精简指令集计算机)架构。RISC架构的核心设计理念之一就是采用定长指令格式,即所有指令的长度相同,以简化指令的取指和译码过程,有利于流水线的设计。
指令长度为32位:MIPS是典型的32位RISC处理器,它的每条指令固定为32位(4个字节)。这与CISC架构(如x86)的变长指令形成鲜明对比。定长指令的优势在于:取指阶段只需固定读取4字节,译码逻辑更加简单高效,非常适合流水线处理。
操作码OP为6位:MIPS指令有三种基本格式——R型(寄存器型)、I型(立即数型)和J型(跳转型)。无论哪种格式,指令的最高6位(第31~26位)都是操作码OP字段。6位操作码理论上可以编码26=64种不同的操作。对于R型指令,OP字段通常为000000,具体的操作由指令末尾的6位功能码(funct字段)进一步区分。
MIPS R型指令格式:OP(6) + rs(5) + rt(5) + rd(5) + shamt(5) + funct(6) = 32位。
MIPS I型指令格式:OP(6) + rs(5) + rt(5) + immediate(16) = 32位。
MIPS J型指令格式:OP(6) + address(26) = 32位。
MIPS是"32位定长指令,6位操作码"。三种指令格式都以6位OP开头,这是MIPS指令设计的统一规则。可以记住"MIPS = 32位指令 + 6位OP",这两个数字是MIPS架构的基本参数。
第3章"指令系统"——MIPS指令格式部分,详细介绍了R型、I型、J型三种指令格式及各字段含义。
微程序控制器中的微程序定序器用来生成微地址,它的实现方法有______法和断定法。
微程序控制器是一种用微程序来产生控制信号的控制器实现方式。在微程序控制器中,每条机器指令对应一段微程序,微程序由若干条微指令组成,这些微指令存储在控制存储器(控存)中。微程序定序器(也称微地址形成部件或微程序序列器)的作用是确定下一条要执行的微指令的地址,即生成微地址序列。
计数器法(增量计数器法):这种方法类似于程序计数器PC的工作原理。使用一个微程序计数器(μPC),在顺序执行微指令时,μPC自动加1以指向下一条微指令的地址。当需要跳转时,将目标微地址直接装入μPC。计数器法的优点是微指令中不需要专门的下地址字段(顺序执行时),可以缩短微指令长度;缺点是当微程序中转移较多时,效率会降低。
断定法(下地址字段法):这种方法在每条微指令中设置一个"下地址"字段,直接指定下一条微指令的地址。断定法的优点是微程序的编排灵活,可以方便地实现微程序的转移和分支;缺点是每条微指令都需要包含下地址字段,增加了微指令的长度。
微地址的两种生成方法可以类比为程序执行中的两种控制流方式:计数器法就像"PC+1"自动顺序执行,断定法就像"goto 地址"强制跳转到指定位置。口诀:"计数器顺序走,断定法指路走"。
第4章"中央处理器"——微程序控制器部分,涉及微地址的形成方式(微程序定序器的实现方法)。
六管静态存储单元是利用MOS管构成的______来存储信息,单管动态存储单元是利用MOS管的______来存储信息。
半导体存储器按照存储机理可分为静态存储器(SRAM)和动态存储器(DRAM)。两者在存储信息的物理原理上有本质不同,这直接影响了它们的速度、密度、功耗和是否需要刷新等特性。
六管静态存储单元(SRAM):SRAM的基本存储单元由6个MOS管组成。其中4个MOS管构成两个交叉耦合的反相器,形成一个锁存器(也可称为双稳态触发器)。锁存器有两个稳定状态,分别代表存储的"0"和"1"。只要不断电,锁存器就会一直保持其状态,因此SRAM不需要刷新操作。另外2个MOS管用作传输门,控制存储单元与位线的连通。SRAM的优点是速度快、不需要刷新;缺点是每个存储单元需要6个管子,集成度低、成本高,常用于Cache。
单管动态存储单元(DRAM):DRAM的基本存储单元仅由1个MOS管和1个电容组成(有的教材说1个管子是因为利用的是MOS管自身的栅极电容)。信息以电荷的形式存储在MOS管的栅极电容上:电容上有电荷代表"1",无电荷代表"0"。由于电容会缓慢漏电,存储的电荷会逐渐消失,因此DRAM必须定期进行刷新操作以维持数据。DRAM的优点是结构简单、集成度高、成本低;缺点是需要刷新、速度比SRAM慢,常用于主存。
SRAM用"锁存器"存信息——像一把锁,锁住了就不会变,所以是"静态"的,不需要刷新。DRAM用"栅极电容"存信息——像一个蓄水池,水(电荷)会慢慢漏掉,所以是"动态"的,需要定期"续水"(刷新)。口诀:"静态靠锁存,动态靠电容"。
第5章"存储器层次结构"——半导体存储器部分,详细介绍了SRAM和DRAM存储单元的结构与工作原理。
磁盘读写操作包括______、旋转等待和______三种操作。
磁盘(硬盘)是计算机系统中最常用的外部存储设备之一。磁盘的物理结构包括若干个盘片,每个盘片表面被划分为若干个同心圆(磁道),每个磁道又被划分为若干个扇区。磁头通过移动臂在盘片表面径向移动来定位到目标磁道,盘片则以固定速度旋转使目标扇区转到磁头下方。
磁盘完成一次读写操作需要经过三个阶段:
1. 寻道(Seek):磁头从当前所在磁道移动到目标数据所在磁道的过程。寻道时间取决于磁头需要跨越的磁道数量,是磁盘访问时间中变化最大的部分,也通常是最耗时的部分。
2. 旋转等待(Rotational Latency):磁头到达目标磁道后,需要等待盘片旋转,使目标扇区转到磁头正下方。平均旋转等待时间等于磁盘旋转半周的时间。例如,7200转/分的磁盘,旋转一周约8.33ms,平均旋转等待时间约4.17ms。
3. 数据传输(Data Transfer):目标扇区到达磁头下方后,开始实际的数据读取或写入操作。数据传输时间取决于要传输的数据量和磁盘的数据传输速率。
因此,磁盘访问时间 = 寻道时间 + 旋转等待时间 + 数据传输时间。
按照操作的时间顺序记忆:"先找道(寻道)→ 再等转(旋转等待)→ 最后读写(数据传输)"。可以类比在图书馆找书:先走到正确的书架(寻道),再找到正确的那一排(旋转等待),然后取出书来阅读(数据传输)。
第6章"互连及输入输出组织"——磁盘存储器部分(也可能在第5章"存储器层次结构"的外存储器部分),涉及磁盘的工作原理与存取时间分析。
常用的DMA方式有CPU停止法、______法和______法。
DMA(Direct Memory Access,直接存储器访问)是一种高效的I/O控制方式,允许外设直接与主存之间传输数据,而不需要CPU逐字节参与。但DMA控制器和CPU都需要访问主存(总线),因此需要解决两者之间的总线使用冲突问题。根据解决冲突方式的不同,DMA有三种主要实现方式。
1. CPU停止法:当DMA需要传输数据时,DMA控制器向CPU发出总线请求(HOLD),CPU在完成当前总线周期后让出总线控制权(HLDA),在整个DMA传输期间CPU完全停止访问主存。优点是实现简单,DMA传输速度快;缺点是CPU在DMA传输期间完全被挂起,利用率低。
2. 周期窃取法(Cycle Stealing):也称周期挪用法。DMA每次只"窃取"一个总线周期来传输一个数据字。当DMA需要传输时,如果CPU恰好不访问主存,则DMA直接使用总线;如果CPU也需要访问主存,则CPU暂停一个总线周期,让DMA先用。每次只窃取一个周期,对CPU影响较小。这是实际中最常用的DMA方式。
3. 交替访存法(Interleaved/Transparent DMA):也称为透明DMA。将一个CPU访存周期分成两个时间片,一个给CPU使用,一个给DMA使用,两者交替访问主存。这种方式对CPU完全没有影响(透明),但要求存储器的速度足够快(访存周期需要减半),硬件实现成本高。
三种DMA方式可以用"排队买饭"来类比:CPU停止法——DMA来了CPU就离开窗口,全部让给DMA;周期窃取法——DMA趁CPU不买的时候插队买一份,CPU只被耽误一小会;交替访存法——两个窗口轮流开,CPU和DMA各用各的,互不干扰。口诀:"停止最简单,窃取最常用,交替最透明"。
第6章"互连及输入输出组织"——DMA方式部分,详细介绍了三种DMA与CPU共享总线的方式。
cache行和主存块之间的映射方式有直接映射、______映射和______映射三种方式。
Cache(高速缓冲存储器)是位于CPU和主存之间的一层高速小容量存储器,用于解决CPU速度与主存速度之间的不匹配问题。Cache中存储的是主存中部分数据的副本。主存被划分为大小相等的"块"(Block),Cache被划分为大小相等的"行"(Line,也称槽Slot),每个Cache行可以存放一个主存块。映射方式决定了一个主存块可以被放到Cache的哪些行中。
1. 直接映射(Direct Mapping):每个主存块只能映射到Cache中固定的一行。映射关系为:Cache行号 = 主存块号 mod Cache总行数。优点是实现简单、查找速度快;缺点是灵活性差,即使Cache有空行也可能因映射冲突而频繁替换,命中率较低。
2. 全相联映射(Fully Associative Mapping):每个主存块可以映射到Cache中的任意一行。优点是灵活性最高,Cache空间利用率高,命中率最高;缺点是查找时需要与所有Cache行的标记(Tag)进行比较,硬件实现复杂,成本高,查找速度慢。
3. 组相联映射(Set Associative Mapping):是直接映射和全相联映射的折中方案。Cache被分成若干个组(Set),每组包含若干行。主存块先按直接映射方式确定映射到哪个组(组号 = 主存块号 mod 组数),然后在该组内采用全相联映射方式放置到组内的任意一行。常见的有2路组相联、4路组相联等。组相联兼顾了查找速度和命中率。
三种映射方式的灵活度递增:直接映射(一对一固定)→ 组相联映射(组间固定,组内任意)→ 全相联映射(完全任意)。可以类比住酒店:直接映射=指定房间号;组相联映射=指定楼层,楼层内任选房间;全相联映射=整个酒店任选房间。口诀:"直接最简单,全相联最灵活,组相联是折中"。
第5章"存储器层次结构"——Cache部分,详细介绍了三种映射方式的原理、地址划分、优缺点及适用场景。
按照总线上信息传送的定时方式来分,有______通信、______通信和半同步通信三类。
总线通信(总线定时)是指总线上主设备和从设备之间协调数据传输时序的方式。不同的定时方式决定了通信双方如何确定数据何时有效、何时可以读取。按照定时方式的不同,总线通信可分为三大类。
1. 同步通信(Synchronous Communication):通信双方使用统一的时钟信号来协调数据传输。所有设备都按照统一的时钟周期来发送和接收数据,每个总线事务占用固定数量的时钟周期。优点是实现简单,总线控制逻辑简单,传输速率高;缺点是所有设备必须以相同的时钟频率工作,总线长度受限,且总线周期必须按最慢设备的速度来设定,不够灵活。适用于总线长度较短、各设备速度差异不大的场合。
2. 异步通信(Asynchronous Communication):通信双方没有统一的时钟信号,而是采用"请求-应答"(握手)方式进行数据传输。发送方发出请求信号,接收方处理完毕后返回应答信号,发送方收到应答后才进行下一步操作。优点是允许不同速度的设备连接在同一总线上,灵活性强;缺点是需要额外的握手信号线,控制逻辑复杂,传输速率受握手过程的影响。
3. 半同步通信(Semi-synchronous Communication):结合了同步和异步通信的特点。基本框架采用同步方式(有统一时钟),但允许从设备通过"等待"(WAIT)信号来延长总线周期。当从设备速度较慢时,它可以通过拉低WAIT信号使总线周期延长一个或多个时钟周期,直到数据准备好。这样既保持了同步通信的简洁性,又能适应不同速度的设备。
同步通信——统一时钟节拍,大家齐步走;异步通信——没有统一节拍,靠握手协商;半同步通信——有统一节拍但允许慢设备喊"等一等"。口诀:"同步靠时钟,异步靠握手,半同步两者兼有"。注意"半同步"不是"半异步",它本质上是在同步基础上增加了等待机制。
第6章"互连及输入输出组织"——总线定时与通信方式部分,详细介绍了三种总线通信方式的工作原理与时序图。
中断服务程序
答案:中断服务程序(ISR,Interrupt Service Routine)是处理器响应中断请求后所执行的一段程序。当CPU检测到中断请求并响应后,会自动跳转到该中断对应的服务程序入口地址,执行相应的中断处理操作(如数据传输、错误处理等),处理完毕后通过中断返回指令返回到被中断程序的断点处继续执行。
在计算机运行过程中,CPU并非始终只做一件事。外部设备(如键盘、磁盘)或内部事件(如运算溢出)可能随时需要CPU的关注。为了让CPU能够"暂停当前任务、去处理紧急事务、然后再回来继续",计算机设计了"中断"机制。中断服务程序就是CPU去处理那件"紧急事务"时所运行的专用程序。
中断服务程序是中断系统的核心组成部分。整个中断处理过程可分为以下几步:
①中断请求:外设或内部事件向CPU发出中断请求信号。
②中断响应:CPU在当前指令执行完毕后检测到中断请求,若允许响应,则暂停当前程序,保存断点(即当前程序计数器PC的值)和现场(即各寄存器的状态)。
③执行中断服务程序:CPU根据中断类型号,通过中断向量表找到对应中断服务程序的入口地址,跳转过去执行。中断服务程序中包含了针对该中断事件的具体处理逻辑,例如从I/O端口读取数据、处理异常错误等。
④中断返回:中断服务程序的最后一条指令通常是中断返回指令(如x86中的IRET),它会恢复之前保存的现场和断点,使CPU回到原来被中断的程序继续执行。
每一种中断源都有与之对应的中断服务程序,这些程序的入口地址存放在中断向量表中。
抓住三个关键词:"响应中断后执行的程序"、"处理特定中断事件"、"执行完毕后返回断点"。答题时需说明中断服务程序是什么(一段处理程序)、何时执行(CPU响应中断后)、执行完做什么(返回断点继续执行)。
袁春风《计算机组成原理》第6章"互连及输入输出组织"中关于中断方式的I/O部分,以及第4章"中央处理器"中异常和中断处理的相关内容。
I/O端口
答案:I/O端口是CPU与外部设备之间进行数据交换的接口寄存器。它是I/O接口电路中可被CPU直接访问的寄存器,通常包括数据端口(用于暂存传输数据)、状态端口(反映设备当前工作状态)和控制端口(接收CPU发出的控制命令)。每个端口都有唯一的端口地址,CPU通过端口地址来选择和访问特定的端口。
CPU的速度极快,而外部设备(如打印机、键盘)速度相对很慢,两者之间不能直接通信。因此,在CPU与外设之间需要一个"中间人"——I/O接口。I/O接口中包含若干可被CPU读写的寄存器,这些寄存器就是所谓的"I/O端口"。可以将端口理解为CPU与外设之间的"信箱":CPU把命令或数据放进去,外设从中取走;或者外设把状态和数据放进去,CPU来读取。
I/O端口按照功能可分为三类:
①数据端口(Data Port):用于在CPU和外设之间暂存待传输的数据。CPU向外设发送数据时,先将数据写入数据端口;CPU从外设接收数据时,从数据端口读取。
②状态端口(Status Port):保存外设当前的工作状态信息,如"设备是否忙"、"数据是否准备好"、"是否出错"等。CPU通过读取状态端口来判断是否可以进行下一步操作。
③控制端口(Control Port):CPU向控制端口写入控制命令,以启动、停止或配置外设的工作方式。
在编址方式上,I/O端口有两种:独立编址(端口地址与内存地址分开,使用专门的I/O指令如IN/OUT访问)和统一编址(也叫存储器映射I/O,端口地址占用内存地址空间的一部分,可用普通访存指令访问)。
核心定义:"I/O接口中可被CPU直接访问的寄存器"。答题时需点明:①它是接口电路中的寄存器;②三种类型(数据、状态、控制);③通过端口地址访问。
袁春风《计算机组成原理》第6章"互连及输入输出组织"中关于I/O接口的组成与功能部分。
存储周期
答案:存储周期(Memory Cycle Time)是指存储器连续两次独立的读(或写)操作所需的最短时间间隔。它包括存储器的访问时间(从给出地址到数据稳定输出的时间)和恢复时间(本次操作完成后到下一次操作开始前存储器所需的恢复时间)。存储周期是衡量存储器速度的重要指标。
衡量存储器速度有多个指标,其中最常用的两个是"存取时间"和"存储周期"。初学者容易混淆这两个概念。存取时间(Access Time)是指从发出读/写命令到数据被读出或写入完成的这段时间;而存储周期则更长,因为存储器在完成一次操作后,内部电路需要一段时间恢复到稳定状态,才能开始下一次操作。
存储周期可用公式表示为:
存储周期 = 存取时间 + 恢复时间
①存取时间(Access Time,TA):从CPU给出有效地址和读/写命令开始,到存储器完成读出或写入操作所经历的时间。它反映的是单次操作本身的耗时。
②恢复时间(Recovery Time):存储器完成一次读/写操作后,其内部信号需要恢复到初始稳定状态才能接受下一次操作。这段等待时间就是恢复时间。对于早期的磁芯存储器,读操作是破坏性的,读后必须"再生"(重新写入),恢复时间较长;对于现代半导体存储器(如SRAM),恢复时间很短。
由此可见,存储周期总是大于或等于存取时间。在计算存储器带宽(单位时间内传输的数据量)时,应以存储周期为基准,而非存取时间。
关键公式:存储周期 = 存取时间 + 恢复时间。答题时需说明:①定义——连续两次独立操作的最短时间间隔;②组成——存取时间加恢复时间;③意义——衡量存储器速度的重要指标,存储周期≥存取时间。
袁春风《计算机组成原理》第5章"存储器层次结构"中关于存储器主要技术指标的部分。
顺序存取存储器
答案:顺序存取存储器(SAM,Sequential Access Memory)是一种只能按照信息存储的物理顺序依次访问的存储器。访问某个特定数据时,必须从头开始按顺序逐个查找,不能直接跳到目标位置。典型代表是磁带存储器。其访问时间取决于数据所在的物理位置,与存储位置有关。
存储器按照数据的访问方式可以分为几大类:随机存取存储器(RAM)、只读存储器(ROM)、顺序存取存储器(SAM)和直接存取存储器(DAM)。其中,随机存取存储器的访问时间与数据存放位置无关,任何地址的数据都可以在相同时间内访问到;而顺序存取存储器则完全相反,它必须按照物理排列顺序一个接一个地查找数据。
①工作原理:顺序存取存储器的数据是按照线性的物理顺序排列的。当需要访问某个特定位置的数据时,读/写头必须从当前位置(或起始位置)开始,依次经过前面所有的数据,直到到达目标位置。这就像听一盘录音磁带,想听第五首歌必须快进跳过前四首。
②典型代表:磁带(Magnetic Tape)是最典型的顺序存取存储器。数据沿磁带纵向排列,读写头只能顺序移动。
③特点:访问时间与数据存放位置有关,越靠后的数据访问时间越长。因此,顺序存取存储器的平均存取时间较长,不适合需要频繁随机访问的场景,但适合大容量、低成本的数据备份和归档。
④与其他存取方式的对比:随机存取(RAM/ROM)——存取时间与位置无关;直接存取(如磁盘)——先直接定位到大致区域,再在小范围内顺序查找;顺序存取——完全依次查找。
核心特征:"按物理顺序依次访问,存取时间与位置有关"。答题需点明:①必须按顺序访问,不能直接定位;②典型代表是磁带;③存取时间取决于数据位置。
袁春风《计算机组成原理》第5章"存储器层次结构"中关于存储器分类的部分。
寻址方式
答案:寻址方式是指指令中用于确定操作数地址(或下一条指令地址)的方法。它规定了如何根据指令中给出的地址码字段来计算或查找操作数的有效地址。常见的寻址方式包括立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、变址寻址、基址寻址、相对寻址等。不同的寻址方式在灵活性、寻址范围和指令长度方面各有优劣。
一条指令通常由操作码和地址码两部分组成。操作码说明"做什么运算",地址码说明"操作数在哪里"。但地址码的含义并不是固定的——有时它直接就是操作数本身,有时它是操作数在内存中的地址,有时它是一个寄存器编号……这种"地址码到底怎么解读"的规则,就是寻址方式。寻址方式的多样性使得指令系统更加灵活高效。
常见的寻址方式及其特点如下:
①立即寻址:操作数直接包含在指令中(即地址码字段存放的就是操作数本身)。速度最快,但操作数大小受指令长度限制。
②直接寻址:地址码字段直接给出操作数在内存中的地址。简单直观,但寻址范围受地址码位数限制。
③间接寻址:地址码字段给出的是操作数地址的地址(即指向一个内存单元,该单元中存放的才是操作数的真正地址)。扩大了寻址范围,但需要多次访存。
④寄存器寻址:操作数存放在CPU内部寄存器中,地址码字段给出寄存器编号。速度快,指令短,但寄存器数量有限。
⑤寄存器间接寻址:寄存器中存放的不是操作数,而是操作数的内存地址。兼顾速度和灵活性。
⑥基址寻址:有效地址 = 基址寄存器内容 + 指令中的偏移量。便于程序的浮动(重定位),常用于多道程序环境。
⑦变址寻址:有效地址 = 变址寄存器内容 + 指令中的地址码。适合处理数组等需要循环访问的数据结构。
⑧相对寻址:有效地址 = PC(程序计数器)当前值 + 指令中的偏移量。常用于转移指令,便于程序浮动。
核心定义:"指令中确定操作数有效地址的方法"。答题时需说明:①寻址方式是根据地址码计算操作数有效地址的规则;②列举常见类型(至少写3~4种);③说明不同寻址方式各有优缺点(灵活性、速度、寻址范围的权衡)。
袁春风《计算机组成原理》第3章"指令系统"中关于操作数寻址方式的部分。
在IEEE 754标准浮点数的加减运算时,为什么要对结果进行尾数的规格化?分别是在什么情况下需要右归和左归?
答案:
规格化的原因:为了保证浮点数表示的精度最大化(使尾数的有效位数最多),同时保证浮点数表示的唯一性。如果不进行规格化,同一个浮点数可能有多种不同的表示形式,而且尾数高位出现无效的0会浪费有效数字位,降低表示精度。
右归(右规):当尾数运算结果溢出(即尾数绝对值 ≥ 2,小数点左边出现了非零的整数位,也就是尾数出现了形如 1X.XXX 的形式)时,需要进行右归。具体做法是:将尾数右移一位,同时阶码加1。右归最多只需执行一次。
左归(左规):当尾数运算结果不是规格化数(即尾数的最高有效位为0,尾数绝对值太小,形如 0.0...0XXX 的形式)时,需要进行左归。具体做法是:将尾数左移一位,同时阶码减1,重复此操作直到尾数变成规格化形式(即最高有效位为1)。左归可能需要执行多次。
IEEE 754标准是目前国际上最广泛使用的浮点数表示标准。浮点数由符号位、阶码和尾数三部分组成,其一般形式为:N = (-1)S × 1.M × 2E-偏置值。在IEEE 754中,规格化的浮点数尾数的整数部分隐含为1(即采用1.M的形式),这个隐含的1不存储,称为"隐藏位"。浮点加减运算的步骤通常包括:对阶→尾数加减→规格化→舍入→溢出判断。
为什么要规格化:
(1)精度最大化:规格化要求尾数的最高有效位必须为有效数字(在IEEE 754中,规格化数的尾数整数部分为1)。如果尾数高位出现多余的0,相当于浪费了存储位,使得能够表示的有效数字变少,精度降低。例如,用8位尾数表示 0.001101 只有4位有效数字,而规格化后 1.101000 可以有7位有效数字。
(2)表示的唯一性:如果不进行规格化,同一个数值可以有多种浮点表示。例如 0.5 可以表示为 1.0×2-1,也可以表示为 0.1×20,还可以表示为 0.01×21 等等。规格化保证了每个浮点数只有唯一的表示方式,便于比较和运算。
右归的情况:
当两个尾数相加后,结果的绝对值 ≥ 2,即尾数的整数部分出现了进位,变成了类似 10.XXXXX 或 11.XXXXX 的形式。此时需要将尾数右移一位(相当于除以2),同时阶码加1(补偿右移造成的数值缩小)。例如:1.1010 + 1.0110 = 10.10000,右归后变为 1.01000 × 21(阶码+1)。右归最多只会执行一次,因为两个规格化数相加最多只会产生一位的进位。
左归的情况:
当两个符号相异的尾数相加(实质是相减)后,结果的高位可能出现一个或多个前导0,使得尾数变成非规格化形式,如 0.00101。此时需要将尾数不断左移(每次乘以2),同时阶码相应减1,直到最高有效位为1。例如:1.0010 - 1.0001 = 0.0001,需要左移4次变为 1.0000 × 2-4(阶码-4)。左归可能需要执行多次,取决于高位有多少个前导0。
(1)规格化 = 保精度 + 保唯一。
(2)"右归一次,左归多次"——右归处理上溢出(结果太大,≥2),只需一次;左归处理前导零(结果太小),可能多次。
(3)右归:尾数右移、阶码+1;左归:尾数左移、阶码-1。两者操作方向相反,阶码变化也相反。
(4)口诀:"加法右归减法左归"——同号相加容易产生进位需要右归,异号相加(减法)容易产生前导零需要左归。
参见袁春风《计算机组成原理》第2章"数据的表示和运算"中关于IEEE 754浮点数标准和浮点数加减运算的相关内容,特别是浮点数规格化和运算步骤部分。
计算机执行指令时,如何形成下一条指令的地址?
答案:
计算机形成下一条指令地址的方式主要有以下几种:
(1)顺序执行时:通过程序计数器PC自动增量来形成。PC的值加上当前指令的长度(即 PC ← PC + 指令字长/8),便得到下一条指令在内存中的地址。这是最常见的情况。
(2)转移/跳转时:当执行转移指令(如无条件跳转JMP、条件分支Branch等)时,由转移指令将目标地址送入PC,从而改变程序的执行顺序。目标地址的形成方式可以是直接寻址(指令中直接给出目标地址)、相对寻址(当前PC值加上偏移量)、间接寻址(通过寄存器或存储单元间接给出地址)等。
(3)调用/返回时:执行调用子程序指令(CALL)时,先将当前PC值(即返回地址)压入栈中保存,然后将子程序的入口地址送入PC;执行返回指令(RET)时,从栈中弹出之前保存的返回地址送入PC。
(4)中断响应时:当CPU响应中断请求后,由中断处理机制将对应的中断服务程序的入口地址(通过中断向量表等方式获取)送入PC。
在冯·诺依曼体系结构中,指令和数据以同等地位存储在存储器中,指令按地址顺序存放,CPU通过程序计数器(PC,Program Counter)来记录当前要执行的指令地址。PC是CPU中一个非常核心的寄存器,它的更新方式决定了程序的执行流程。CPU的指令执行过程为"取指→译码→执行"循环,每次取指时都根据PC的当前值到存储器中读取指令。
(1)PC自动增量(顺序执行):
这是程序执行的默认模式。大多数指令执行完毕后,PC会自动加上当前指令的长度(以字节为单位)。例如,如果当前指令地址为 0x1000,指令长度为4个字节,则执行完毕后 PC = 0x1000 + 4 = 0x1004,指向下一条指令。对于变长指令集(如x86),不同指令长度不同,PC的增量也不同。对于定长指令集(如MIPS,每条指令4字节),PC每次固定加4。
(2)转移指令修改PC(跳转执行):
转移指令通过各种寻址方式计算出目标地址并送入PC。常见的方式有:①直接(绝对)寻址:目标地址直接编码在指令中,如 JMP 0x2000;②PC相对寻址:目标地址 = 当前PC + 指令中的偏移量,常用于条件分支指令,偏移量可正可负;③寄存器间接寻址:目标地址存放在某个寄存器中,如 JMP (R1)。条件分支指令会根据条件码(如零标志Z、进位标志C等)或寄存器比较结果,决定是否将目标地址送入PC。
(3)子程序调用与返回:
调用指令(CALL)执行时会做两件事:第一,将下一条指令的地址(即返回地址 = PC+指令长度)压入系统栈保存;第二,将被调用子程序的入口地址写入PC。返回指令(RET)则从栈顶弹出之前保存的返回地址,送入PC,使程序回到调用点继续执行。
(4)中断处理:
当外部设备或内部异常触发中断,CPU在当前指令执行完毕后响应中断。响应过程中,CPU先保存当前PC值(断点地址),然后根据中断类型号查找中断向量表,从中取出对应的中断服务程序入口地址送入PC。中断返回指令(IRET)则恢复之前保存的断点地址到PC。
(1)四种情况:顺序(PC+增量)、跳转(目标地址→PC)、调用/返回(栈保存/恢复PC)、中断(向量表→PC)。
(2)核心思想:所有方式本质上都是修改PC的值,区别仅在于新PC值的来源不同。
(3)顺序执行是默认行为,其他三种都是改变执行流的特殊情况。
(4)调用/返回和中断都需要保存和恢复PC,通常使用栈结构来实现。
参见袁春风《计算机组成原理》第4章"中央处理器"中关于指令执行过程、程序计数器PC的工作原理、指令寻址方式等内容,以及第3章"指令系统"中关于转移指令和寻址方式的相关论述。
指令流水线中的流水线冒险包括哪几种?试分别说明它们产生的原因。
答案:
流水线冒险(Pipeline Hazards)包括以下三种:
(1)结构冒险(Structural Hazard):也称资源冲突。产生原因是多条指令在同一时钟周期内争用同一个硬件资源(如存储器、ALU、寄存器文件的读写端口等),而该资源无法同时满足多条指令的需求,由此引发冲突。
(2)数据冒险(Data Hazard):也称数据相关。产生原因是流水线中后续指令需要使用前面指令的运算结果,但前面的指令尚未完成运算或尚未将结果写回,导致后续指令无法获得正确的操作数。数据冒险包括三种类型:写后读(RAW)相关、读后写(WAR)相关、写后写(WAW)相关。其中RAW是最常见的数据冒险。
(3)控制冒险(Control Hazard):也称控制相关。产生原因是转移指令(分支指令)改变了程序的执行顺序,在分支条件和转移目标地址尚未确定之前,流水线无法知道下一条应该取哪条指令,可能已经错误地取入了后续指令,导致流水线中出现错误的指令序列。
指令流水线是一种通过将指令执行过程分成多个阶段(如取指IF、译码ID、执行EX、访存MEM、写回WB),让多条指令重叠执行来提高CPU吞吐率的技术。理想情况下,流水线每个时钟周期都能完成一条指令。但在实际执行中,由于指令之间存在各种依赖关系或资源限制,流水线可能会出现"冒险"(Hazard),使得下一条指令无法在预定的时钟周期内执行,导致流水线停顿(stall),降低流水线效率。
(1)结构冒险(资源冲突):
产生原因:硬件资源数量不足,无法支持所有指令在流水线各阶段的同时操作。最典型的例子是统一存储器(指令和数据共用同一存储器)的情况:当一条指令处于"取指"阶段需要访问存储器读取指令,而另一条指令同时处于"访存"阶段需要访问存储器读写数据,两者就会发生存储器访问冲突。
解决方法:①增加硬件资源(如采用哈佛结构,将指令存储器和数据存储器分开);②插入流水线气泡(暂停一拍)。
(2)数据冒险(数据相关):
产生原因:指令之间存在数据依赖关系。例如有两条连续指令:
指令1:ADD R1, R2, R3 (R1 ← R2 + R3)
指令2:SUB R4, R1, R5 (R4 ← R1 - R5)
指令2需要使用R1的值,但指令1在"写回"阶段才会将结果写入R1。如果指令2在指令1完成写回之前就读取了R1,将得到旧值,导致计算错误。这就是写后读(RAW,Read After Write)相关,是最常见也是"真正的"数据冒险。
三种数据冒险类型:①RAW(写后读):后面的指令要读取前面指令的写入结果——这是真相关,必须处理;②WAR(读后写):后面的指令要写入前面指令读取的寄存器——在简单的顺序流水线中一般不会发生;③WAW(写后写):两条指令要写入同一个寄存器——在简单流水线中一般不会发生,但在多发射或乱序执行的流水线中可能出现。
解决方法:①数据转发/旁路(Forwarding/Bypassing)——将前面指令的运算结果直接转发给后续指令,不必等待写回;②编译器调度指令顺序,插入无关指令填充空隙;③插入流水线气泡(stall)等待。
(3)控制冒险(控制相关):
产生原因:当CPU遇到条件分支指令时,需要在"执行"阶段(甚至更晚)才能确定分支是否成立以及跳转的目标地址。但按照流水线的工作方式,在分支指令取指后的下一个时钟周期就要取下一条指令。此时分支结果还未确定,CPU不知道应该取分支目标处的指令还是顺序下一条指令。如果猜错了,已经进入流水线的指令就必须被清除(flush),造成性能损失。
解决方法:①分支预测(静态预测或动态预测)——猜测分支是否成立,提前取相应指令,猜错时再清除;②延迟分支——在分支指令后安排一条与分支无关的有用指令,利用分支延迟槽;③提前计算分支目标地址——将分支判断提前到"译码"阶段完成,减少损失的时钟周期数。
(1)三种冒险可用"结、数、控"来记忆:结构冒险(抢资源)、数据冒险(等数据)、控制冒险(猜方向)。
(2)结构冒险的根源是硬件资源不足;数据冒险的根源是指令间有数据依赖;控制冒险的根源是分支方向未确定。
(3)解决思路:结构冒险靠加资源,数据冒险靠转发/调度,控制冒险靠预测/延迟。
(4)数据冒险中RAW是最重要、最常考的类型,也是唯一的"真数据相关"。
参见袁春风《计算机组成原理》第4章"中央处理器"中关于指令流水线的相关内容,特别是流水线冒险(Hazard)的分类、产生原因和解决方法部分。
I/O端口的编址方式有哪两种?简述它们的编址方法和优缺点。
答案:
I/O端口的编址方式有以下两种:
(1)独立编址(专用I/O端口编址):
编址方法:I/O端口地址与主存地址各自独立,拥有独立的地址空间。CPU需要使用专门的I/O指令(如IN、OUT指令)来访问I/O端口,并通过专用的I/O控制信号线来区分访问的是I/O端口还是存储器。
优点:①I/O端口地址不占用主存地址空间,主存地址空间可以被完整使用;②I/O指令与访存指令区分明显,程序清晰易读,便于理解和维护。
缺点:①需要设置专门的I/O指令,增加了指令系统的复杂性;②CPU需要设置专门的I/O地址线和控制信号线,增加了硬件复杂度;③I/O指令的功能通常较弱,不如访存指令灵活丰富。
(2)统一编址(存储器映射编址 / 内存映射I/O):
编址方法:将I/O端口的地址统一映射到主存地址空间中的某个区域,I/O端口与主存单元统一编址。CPU可以使用普通的访存指令(如LOAD、STORE)来访问I/O端口,不需要专门的I/O指令。
优点:①不需要专门的I/O指令,所有访存指令都可以用来操作I/O端口,指令功能强大、使用灵活;②不需要专门的I/O控制信号线,简化了硬件设计。
缺点:①I/O端口占用了部分主存地址空间,使可用主存容量减少;②从程序指令本身不容易区分当前操作是访问存储器还是访问I/O端口,程序的可读性降低。
I/O端口(I/O Port)是CPU与外部设备交换信息的接口寄存器,包括数据寄存器、状态寄存器和控制寄存器等。CPU要想访问某个I/O设备的端口,首先需要知道该端口的地址。如何给I/O端口分配地址,就涉及I/O端口的编址方式。编址方式的选择直接影响指令系统的设计和硬件结构。
(1)独立编址(Isolated I/O 或 Port-mapped I/O):
在这种方式下,I/O地址空间和内存地址空间是两个完全独立的地址空间。例如,地址 0x100 在内存空间中对应一个内存单元,在I/O空间中对应一个I/O端口,两者互不影响。CPU通过不同的指令来区分:执行MOV等访存指令时访问内存空间,执行IN/OUT等I/O指令时访问I/O空间。同时,CPU通过总线上的一根专用控制线(通常称为M/IO#信号线)来告知总线上的设备当前地址是内存地址还是I/O地址。
典型应用:Intel x86架构采用独立编址方式。x86有专门的IN和OUT指令用于I/O操作,I/O地址空间为0~65535(16位,共64KB)。
(2)统一编址(Memory-mapped I/O):
在这种方式下,I/O端口和内存单元共享同一个地址空间。系统将地址空间的一部分区域划分出来专门分配给I/O端口使用。对CPU而言,访问I/O端口和访问内存单元没有任何区别,都使用相同的LOAD/STORE指令和相同的地址总线、数据总线、控制总线。
典型应用:ARM架构、MIPS架构等RISC处理器普遍采用统一编址方式。例如,在某个系统中,地址空间的高端区域 0xF000_0000 ~ 0xFFFF_FFFF 分配给I/O设备,其余地址空间分配给内存。
两种方式的对比总结:
| 比较项目 | 独立编址 | 统一编址 |
|---|---|---|
| 地址空间 | I/O和内存各自独立 | I/O和内存共享 |
| 指令 | 需要专门的I/O指令 | 使用普通访存指令 |
| 对内存空间的影响 | 不占用内存空间 | 占用部分内存空间 |
| 程序可读性 | I/O操作明确易辨 | 不易区分I/O和访存 |
| I/O操作灵活性 | 受限于I/O指令功能 | 可用全部访存指令,灵活 |
| 典型架构 | x86 | ARM、MIPS等RISC架构 |
(1)两种编址方式:独立编址(I/O空间单独)、统一编址(I/O和内存共用空间)。
(2)独立编址的关键词:专门I/O指令(IN/OUT)、不占内存空间、程序易读、但I/O指令功能弱。
(3)统一编址的关键词:普通访存指令(LOAD/STORE)、占用内存空间、操作灵活、但不易区分。
(4)口诀:"独立有专指(专用I/O指令),统一省指令(用访存指令);独立不占存,统一占空间"。
(5)两种方式各有优劣,互为镜像——独立编址的优点正是统一编址的缺点,反之亦然。
参见袁春风《计算机组成原理》第6章"互连及输入输出组织"中关于I/O端口及其编址方式的相关内容,特别是独立编址与统一编址的概念、方法和优缺点比较部分。
有两个不同的指令序列X1和X2,在时钟频率为1GHz的机器上运行,指令序列中用到的指令类型有A、B、C和D四类。四类指令的CPI和两个指令序列中各类指令条数如题28表所示。试分别计算指令序列X1和X2的CPI、时钟周期数、执行时间。
| 指令类型 | A | B | C | D |
|---|---|---|---|---|
| 各类指令的CPI | 1 | 3 | 4 | 2 |
| X1的指令条数 | 7 | 2 | 3 | 2 |
| X2的指令条数 | 2 | 3 | 5 | 3 |
指令序列X1:CPIX1 = 29/14 ≈ 2.07,时钟周期数 = 29,执行时间 = 29ns
指令序列X2:CPIX2 = 37/13 ≈ 2.85,时钟周期数 = 37,执行时间 = 37ns
本题考查CPU性能评价的核心公式。需要掌握以下概念和公式:
一、计算指令序列 X1
第一步:求X1的总指令条数
ICX1 = 7 + 2 + 3 + 2 = 14(条)
第二步:求X1的总时钟周期数
总时钟周期数 = 各类指令条数 × 各类指令的CPI 之和
= 7 × 1 + 2 × 3 + 3 × 4 + 2 × 2
= 7 + 6 + 12 + 4
= 29(个时钟周期)
第三步:求X1的CPI
CPIX1 = 总时钟周期数 / 总指令条数 = 29 / 14 ≈ 2.07
第四步:求X1的执行时间
时钟频率 f = 1 GHz = 109 Hz
时钟周期 Tclk = 1 / f = 1 / 109 s = 1 ns
执行时间 = 总时钟周期数 × 时钟周期 = 29 × 1 ns = 29 ns
二、计算指令序列 X2
第一步:求X2的总指令条数
ICX2 = 2 + 3 + 5 + 3 = 13(条)
第二步:求X2的总时钟周期数
总时钟周期数 = 2 × 1 + 3 × 3 + 5 × 4 + 3 × 2
= 2 + 9 + 20 + 6
= 37(个时钟周期)
第三步:求X2的CPI
CPIX2 = 总时钟周期数 / 总指令条数 = 37 / 13 ≈ 2.85
第四步:求X2的执行时间
执行时间 = 总时钟周期数 × 时钟周期 = 37 × 1 ns = 37 ns
三、结果汇总
| CPI | 时钟周期数 | 执行时间 | |
|---|---|---|---|
| X1 | 29/14 ≈ 2.07 | 29 | 29 ns |
| X2 | 37/13 ≈ 2.85 | 37 | 37 ns |
结论:X2比X1的CPI更大、时钟周期数更多、执行时间更长,因此X1性能优于X2。
参见袁春风《计算机组成原理》第1章 -- 计算机系统概述,CPU性能评价指标(CPI、MIPS、执行时间等)。
将十进制数-67.34375转换成IEEE754的32位单精度浮点数的二进制格式,并写出其16进制格式。
注:IEEE754单精度浮点数的计数公式为(-1)s × 1.f × 2(e-127),其中符号位s为1位,阶码e为8位,尾数f为23位。
二进制格式:1 10000101 00001101011000000000000
十六进制格式:C286B000H
IEEE 754 单精度浮点数共32位,由三部分组成:
| 字段 | 符号位 s | 阶码 e | 尾数 f |
|---|---|---|---|
| 位数 | 1位 | 8位 | 23位 |
| 含义 | 0正1负 | 移码,偏移量127 | 规格化尾数的小数部分 |
计算公式:值 = (-1)s × 1.f × 2(e-127),其中隐含了整数部分的"1"(隐藏位)。
第一步:确定符号位 s
-67.34375 是负数,所以 s = 1
第二步:将绝对值 67.34375 的整数部分转换为二进制
采用"除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
逆序排列:67 = 10000112
验证:1×26 + 1×21 + 1×20 = 64 + 2 + 1 = 67 ✔
第三步:将小数部分 0.34375 转换为二进制
采用"乘2取整,顺序排列"法:
0.34375 × 2 = 0.6875 → 取整数部分 0 0.6875 × 2 = 1.375 → 取整数部分 1 0.375 × 2 = 0.75 → 取整数部分 0 0.75 × 2 = 1.5 → 取整数部分 1 0.5 × 2 = 1.0 → 取整数部分 1(小数部分变为0,终止)
顺序排列:0.34375 = 0.010112
验证:0×2-1 + 1×2-2 + 0×2-3 + 1×2-4 + 1×2-5 = 0.25 + 0.0625 + 0.03125 = 0.34375 ✔
第四步:合并整数和小数部分
67.34375 = 1000011.010112
第五步:规格化(化为 1.xxxx × 2n 的形式)
将小数点左移6位:
1000011.01011 = 1.00001101011 × 26
(小数点从原来位置向左移动了6位,所以指数为6)
第六步:求阶码 e(使用移码表示,偏移量为127)
e = 实际指数 + 偏移量 = 6 + 127 = 133
将133转为8位二进制:
133 = 128 + 4 + 1 = 27 + 22 + 20 133 = 100001012
验证:128 + 4 + 1 = 133 ✔
第七步:求尾数 f(取规格化后小数点右边的部分,补足23位)
规格化结果 = 1.00001101011 × 26
取小数部分(红色部分),共11位有效数字,后面补12个0凑够23位:
f = 00001101011000000000000
(注意:整数部分的"1"被隐藏,不存储在尾数字段中)
第八步:拼接得到32位IEEE 754格式
s e(8位) f(23位) ┌───┬──────────────┬─────────────────────────────────────────────┐ │ 1 │ 1 0 0 0 0 1 0 1 │ 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 │ └───┴──────────────┴─────────────────────────────────────────────┘
完整32位二进制:1 10000101 00001101011000000000000
第九步:转换为十六进制
将32位二进制每4位一组,从左到右分组:
1100 0010 1000 0110 1011 0000 0000 0000 C 2 8 6 B 0 0 0
十六进制结果:C286B000H
验证
(-1)1 × 1.00001101011 × 2(133-127)
= -1 × 1.00001101011 × 26
= -1 × 1000011.010112
= -1 × 67.34375
= -67.34375 ✔
参见袁春风《计算机组成原理》第2章第2节 -- IEEE 754浮点数标准,浮点数的表示与转换。
用8位二进制补码计算"-120+(-10)",结果用补码表示,并指出最后标志位SF、CF、OF和ZF分别是多少?
运算结果(补码):011111102
标志位:SF = 0,CF = 1,OF = 1,ZF = 0
注意:由于发生了溢出(OF=1),运算结果 01111110(表示+126)是错误的。真实数学结果-130超出了8位补码的表示范围[-128, +127]。
本题考查补码加法运算以及标志位的判定。
第一步:将 -120 转换为8位补码
先求 +120 的二进制:120 = 64 + 32 + 16 + 8 = 011110002
+120 的原码:0 1 1 1 1 0 0 0 按位取反: 1 0 0 0 0 1 1 1 加1: 1 0 0 0 1 0 0 0
所以 -120 的补码 = 100010002
验证:-128 + 8 = -120 ✔
第二步:将 -10 转换为8位补码
先求 +10 的二进制:10 = 8 + 2 = 000010102
+10 的原码:0 0 0 0 1 0 1 0 按位取反: 1 1 1 1 0 1 0 1 加1: 1 1 1 1 0 1 1 0
所以 -10 的补码 = 111101102
验证:-128 + 64 + 32 + 16 + 4 + 2 = -128 + 118 = -10 ✔
第三步:执行补码加法(逐位相加,记录每一位的进位)
位号: b7 b6 b5 b4 b3 b2 b1 b0
─────────────────────────────────────
-120 补码: 1 0 0 0 1 0 0 0
+ -10 补码: 1 1 1 1 0 1 1 0
─────────────────────────────────────
逐位计算(从最低位b0开始):
b0: 0 + 0 + 进位0 = 0 进位C1 = 0
b1: 0 + 1 + 进位0 = 1 进位C2 = 0
b2: 0 + 1 + 进位0 = 1 进位C3 = 0
b3: 1 + 0 + 进位0 = 1 进位C4 = 0
b4: 0 + 1 + 进位0 = 1 进位C5 = 0
b5: 0 + 1 + 进位0 = 1 进位C6 = 0
b6: 0 + 1 + 进位0 = 1 进位C7 = 0 ← 进入最高位的进位
b7: 1 + 1 + 进位0 = 10 进位C8 = 1 ← 最高位产生的进位(溢出位)
─────────────────────────────────────
结果: 0 1 1 1 1 1 1 0 进位溢出: 1
运算结果(8位)= 011111102,最高位进位 C8 = 1
第四步:判定各标志位
(1) SF(符号标志)= 结果的最高位 = 0
结果 01111110 的最高位(b7)为 0,所以 SF = 0。
(2) ZF(零标志):结果是否为零?
结果 01111110 ≠ 00000000,所以 ZF = 0。
(3) CF(进位标志)= 最高位的进位输出 C8
在上面的逐位计算中,b7位的加法产生了进位 C8 = 1,所以 CF = 1。
(4) OF(溢出标志)= C7 ⊕ C8(次高位进位 异或 最高位进位)
C7(进入最高位b7的进位)= 0
C8(从最高位b7产生的进位)= 1
OF = C7 ⊕ C8 = 0 ⊕ 1 = 1(发生溢出!)
溢出分析
数学真值:-120 + (-10) = -130
8位补码表示范围:-128 ~ +127
-130 < -128,超出表示范围,确实发生溢出。
实际得到的结果 011111102 = +126,与期望值 -130 完全不符,正是溢出导致的错误结果。
溢出规律:两个负数相加得到正数(符号位从1变成0),说明发生了负溢出(下溢)。这与 OF = 1 的判定一致。
最终结果汇总
| 项目 | 值 | 说明 |
|---|---|---|
| 运算结果(补码) | 01111110 | 因溢出导致结果错误(表示+126而非-130) |
| SF | 0 | 结果最高位为0 |
| CF | 1 | 最高位产生了进位 |
| OF | 1 | C7⊕C8 = 0⊕1 = 1,有符号溢出 |
| ZF | 0 | 结果不为零 |
参见袁春风《计算机组成原理》第2章第3节 -- 定点数的加减运算与溢出判断,标志位(SF、CF、OF、ZF)的含义与判定方法。
设某计算机的主存地址空间大小为128MB,采用字节编址方式,其cache数据区容量为8KB,采用直接映射方式,块大小为256B。请问:
(1)主存地址有多少位?它被划分成哪几个字段?要求清晰地说明每个字段的含义、位数和在主存地址中的位置。
(2)该cache的总容量(含标记区和数据区)有多少位(bit)?
(1)主存地址为 27 位,划分为三个字段:
| 字段名称 | 位数 | 位置(高→低) |
|---|---|---|
| 标记(Tag) | 14 位 | 第 26~13 位 |
| 行号/索引(Index) | 5 位 | 第 12~8 位 |
| 块内地址/字节偏移(Block Offset) | 8 位 | 第 7~0 位 |
主存地址格式示意:
| 标记(Tag) 14 位 [26:13] |
行号(Index) 5 位 [12:8] |
块内地址(Offset) 8 位 [7:0] |
(2)Cache 总容量 = 66016 位(bit)
计算过程:每个 Cache 行包含 1 位有效位 + 14 位标记 + 256×8 = 2048 位数据 = 2063 位;共 32 行,总容量 = 32 × 2063 = 66016 位。
本题考查的是Cache(高速缓冲存储器)的基本原理,属于"存储器层次结构"这一章的核心考点。要理解本题,需要掌握以下几个基本概念:
在直接映射方式下,主存地址被划分为三个字段:标记(Tag)、行号/索引(Index)、块内地址/偏移(Offset)。CPU 访问 Cache 时,先用"行号"找到 Cache 对应行,再比较"标记"看是否命中,命中后用"块内地址"定位到具体字节。
第(1)问:主存地址位数及字段划分
第一步:计算主存地址位数
主存地址空间 = 128MB = 128 × 1024 × 1024 B = 27 × 210 × 210 B = 227 B
由于采用字节编址,每个字节需要一个唯一地址,因此需要 27 位地址来表示 227 个不同地址。
💡 理解要点:地址位数 = log₂(地址空间的字节数)。128MB = 227,所以地址位数 = 27。
第二步:计算块内地址(Offset)字段位数
块大小 = 256B = 28 B
一个块内有 256 个字节,需要 8 位来区分块内每个字节的位置,因此块内地址字段 = 8 位。
这 8 位放在主存地址的最低位(第 7~0 位)。
第三步:计算行号/索引(Index)字段位数
Cache 数据区容量 = 8KB = 8 × 1024 B = 213 B
Cache 行数 = Cache 数据区容量 ÷ 块大小 = 213 ÷ 28 = 25 = 32 行
需要 5 位来指定 32 行中的哪一行,因此行号字段 = 5 位。
这 5 位紧接在块内地址的上方(第 12~8 位)。
第四步:计算标记(Tag)字段位数
标记位数 = 主存地址位数 - 行号位数 - 块内地址位数 = 27 - 5 - 8 = 14 位
这 14 位在主存地址的最高位(第 26~13 位)。
💡 标记的作用:由于直接映射方式下多个主存块会映射到同一个 Cache 行(例如主存第 0 块和第 32 块都映射到 Cache 第 0 行),CPU 需要通过比较标记来判断当前 Cache 行中存放的是不是自己要访问的那个主存块。
各字段含义汇总:
| 字段 | 含义 | 位数 | 位置 | 作用 |
|---|---|---|---|---|
| 标记(Tag) | 标识该块属于主存中的哪一组 | 14 位 | 高位 [26:13] | 与 Cache 行中存储的标记比较,判断是否命中 |
| 行号(Index) | 指定 Cache 中的行号(组号) | 5 位 | 中间 [12:8] | 直接定位到 Cache 的某一行进行查找 |
| 块内地址(Offset) | 指定块内的字节位置 | 8 位 | 低位 [7:0] | 在命中的 Cache 行数据中定位到具体字节 |
第(2)问:Cache 总容量(位 bit)
Cache 的"总容量"不仅包括数据区,还包括每行的管理信息。在直接映射方式下,每个 Cache 行包含:
💡 注意:直接映射方式下通常不需要"替换算法位"(因为映射关系唯一,没有选择余地);也没有"脏位/修改位"(题目未说明写策略,一般默认不计)。因此每行管理信息 = 有效位 + 标记位 = 1 + 14 = 15 位。
每行总位数计算:
每行 = 有效位 + 标记位 + 数据位 = 1 + 14 + 2048 = 2063 位
Cache 总容量计算:
总容量 = Cache 行数 × 每行位数 = 32 × 2063 = 66016 位
验证拆分:
| 组成部分 | 每行位数 | 行数 | 小计(位) |
|---|---|---|---|
| 有效位 | 1 | 32 | 32 |
| 标记位 | 14 | 32 | 448 |
| 数据位 | 2048 | 32 | 65536 |
| 合计 | 2063 | 32 | 66016 |
袁春风《计算机组成原理》第5章 存储器层次结构,5.3 节 高速缓冲存储器(Cache),重点内容包括:
某计算机字长16位,采用16位定长指令格式,部分数据通路结构如题32图所示。假设MAR的输出一直处于使能状态。对于指令 AND R1, (R2),请回答下列两问。
(1)在执行阶段需要多少个节拍?
(2)写出每个节拍的功能和有效控制信号。
注:该指令功能为:R[R1] ← R[R1] "逻辑与" M[R[R2]]
题32图 数据通路结构说明(文字描述):
该计算机采用单总线(Single Bus)结构,所有部件通过一条公共内部总线连接。各部件及其控制信号如下:
由于是单总线结构,每个节拍内只能有一个部件向总线发送数据(即只能有一个 ×out 信号有效),但可以有多个部件同时从总线接收数据(多个 ×in 信号可同时有效)。
(1)执行阶段需要 4 个节拍。
(2)各节拍的功能和有效控制信号如下表:
| 节拍 | 微操作(功能) | 有效控制信号 | 说明 |
|---|---|---|---|
| T1 | MAR ← R[R2] | R2out, MARin | 将 R2 的内容(内存地址)送到 MAR,为读内存做准备 |
| T2 | MDR ← M[MAR] Y ← R[R1] |
MemR, R1out, Yin | 启动存储器读操作(MDR 从存储器数据总线加载,不占用内部总线);同时将 R1 内容经内部总线送入暂存器 Y |
| T3 | Z ← Y AND MDR | MDRout, AND | MDR 内容送上总线作为 ALU 的 B 输入,Y 的内容作为 ALU 的 A 输入(Y 直连 ALU),ALU 执行逻辑与运算,结果存入 Z |
| T4 | R1 ← Z | Zout, R1in | 将运算结果从 Z 经总线送回 R1,完成指令执行 |
本题考查的是CPU 数据通路与微操作序列的设计,属于"中央处理器"这一章的核心内容。要解答本题,需要理解以下概念:
分析指令功能
指令 AND R1, (R2) 的功能是:R[R1] ← R[R1] AND M[R[R2]]
用自然语言描述:将 R1 寄存器中的值 与 以 R2 寄存器内容为地址从内存中取出的值 进行"逻辑与"运算,结果写回 R1。
分解操作步骤
为完成此指令的执行阶段,需要依次完成以下操作:
关键优化:步骤 2 和 3 可以并行!
存储器读操作(MemR)使 MDR 从存储器数据总线加载数据,这个过程不占用 CPU 内部总线。因此,在存储器读的同时,可以利用内部总线将 R1 内容传送到 Y。这样步骤 2 和步骤 3 可以在同一个节拍内完成,从而将总节拍数从 5 减少到 4。
逐节拍详细分析
节拍 T1:MAR ← R[R2]
| 微操作 | MAR ← R[R2] |
| 控制信号 | R2out, MARin |
| 数据流向 | R2 → (内部总线)→ MAR → (地址总线)→ 存储器地址输入 |
| 说明 | R2out 使 R2 的内容驱动内部总线,MARin 使 MAR 在时钟边沿锁存总线上的数据。由于 MAR 的输出一直使能(题目已说明),所以 R2 的内容会立即通过地址总线传递给存储器。 |
节拍 T2:MDR ← M[MAR];同时 Y ← R[R1]
| 微操作 | ① MDR ← M[MAR](通过存储器数据总线) ② Y ← R[R1](通过内部总线) |
| 控制信号 | MemR, R1out, Yin |
| 数据流向 | ① 存储器 → (数据总线)→ MDR ② R1 → (内部总线)→ Y |
| 说明 | 这是本题的关键并行操作。MemR 信号启动存储器读操作,存储器根据 MAR 中的地址将数据通过外部数据总线送入 MDR——这条路径不经过 CPU 内部总线。因此,内部总线空闲,可以同时用 R1out 将 R1 驱动到内部总线上,用 Yin 将总线数据锁存到暂存器 Y 中。两个操作互不冲突,可以在同一节拍完成。 |
节拍 T3:Z ← Y AND MDR
| 微操作 | Z ← Y AND MDR |
| 控制信号 | MDRout, AND |
| 数据流向 | Y →(直连)→ ALU 的 A 端 MDR →(内部总线)→ ALU 的 B 端 ALU 输出 →(直连)→ Z |
| 说明 | MDRout 将 MDR 的内容(即从内存读出的操作数 M[R[R2]])送上内部总线,作为 ALU 的 B 输入。Y 中存放的 R1 值作为 ALU 的 A 输入(Y 的输出直连 ALU,无需控制信号)。AND 信号选择 ALU 执行逻辑与运算。运算结果自动存入 Z(Z 直接接收 ALU 输出,无需额外控制信号)。 |
节拍 T4:R1 ← Z
| 微操作 | R1 ← Z |
| 控制信号 | Zout, R1in |
| 数据流向 | Z → (内部总线)→ R1 |
| 说明 | Zout 将运算结果从 Z 送上内部总线,R1in 将总线数据写入 R1。至此,R1 中存放了 R[R1] AND M[R[R2]] 的结果,指令执行完毕。 |
完整执行流程示意图(文字版):
| 节拍 | 内部总线占用者 | 存储器端操作 | ALU 操作 | 控制信号 |
|---|---|---|---|---|
| T1 | R2 → 总线 → MAR | — | — | R2out, MARin |
| T2 | R1 → 总线 → Y | M[MAR] → MDR | — | MemR, R1out, Yin |
| T3 | MDR → 总线 → ALU(B) | — | Y AND Bus → Z | MDRout, AND |
| T4 | Z → 总线 → R1 | — | — | Zout, R1in |
为什么不能进一步减少节拍?
袁春风《计算机组成原理》第4章 中央处理器,重点内容包括: