计算机组成原理习题(2)

3、存储系统

3.1、存储器概述

01、存取时间 Ta 是指从存储器读出或写入一次信息所需要的平均时间;

存取周期 Tc 是指连续两次访问存储器之间所必需的最短时间间隔。

对 Tc 一般有 Tc = Ta +Tr;其中 Tr 为复原时间;对 SRAM 指存取信息的稳定时间,对 DRAM 指刷新的又一次存取时间。


02、磁盘属于直接存取存储器,其速度介于随机存取存储器和顺序存取存储器之间。

非易失性存储器:【ROM】、【MROM】、【PROM】、【EPROM】、【Flash存储器】、【SSD】、【E2PROM(写速慢于读速)】。

易失性存储器:【SRAM(用于Cache)】、【DRAM(用于大容量主存系统)】

随机存取存储器:【SRAM】、【DRAM】。

只读存储器:【MROM】、【PROM】、【EPROM】、【闪存】。

U 盘属于【只读存储器】。 CD-ROM 即光盘,采用串行存取方式。


03、在 Cache 和主存构成的两级存储体系中,主存与 Cache 同时访问,Cache 的存取时间是100ns,主存的存取时间是 1000ns,设 Cache 和主存同时访问,若希望有效(平均)存取时间不超过Cache 存取时间的 115%,则 Cache 的命中至少应为【99%】。

解析:假设命中率为 x,可得 100 x + 1000( 1 - x ) ≤ \leq 100 ×(1+15%),简单计算后可得结果为 98.33%,因此命中率至少为 99%。
注意:本题采用同时访问 Cache 和主存的方式,此时不命中的访问时间为 1000nS,但若题设中没有说明(通常会说明〕,则默认 Cache 不命中的时间为访问Cache和主存的时间之和。


04、主存和辅存之间的数据调动是由硬件和操作系统共同完成的,仅对应用级程序员透明。


05、CPU 执行一段程序时,Cache 完成存取的次数为 1900,主存完成存取的次数为 100,已知 Cache 存取周期为 50ns,主存存取周期为 250ns。设主存与 Cache 同时访问。

1)Cache/主存系统的效率是多少; 2)平均访问时间是多少。

解析:1)命中率 H = Nc /( Nc + Nm )= 1900 / (1900 + 100)= 0.95。主存访问时间与Cache 访问时间的倍率 r = Tm / Tc = 250ns / 50ns = 5;Cache 主存系统的效率 e = 访问 Cache 的时间 / 平均访存时间。
访问效率 e = 1 / [ H + (1 - H) r ] = 1 / [ 0.95 + ( 1 - 0.95 )×5 ] = 83.3%。
2)平均访问时间 Ta = Tc / e = 50ns / 0.833 = 60ns。


3.2、主存储器


01、DRAM 刷新对 CPU 是【透明】的,即刷新不依赖于外部的访问;动态 RAM 的刷新单位是行,由芯片内部自行生成行地址;刷新操作类似与读操作。刷新方式:【集中刷新】、【分散刷新==(不存在死区)==】、【异步刷新】。


02、存储器芯片由【存储体】、【I/O 读写电路】、【地址译码器】和【控制电路】等部分组成。


03、数据线的宽度与 【MDR】 的宽度相同,地址线的宽度与 【MAR】的宽度相同。但要注意低位交叉编址时,存储器总线宽度有时不一定和所用芯片的MDR一致。


04、设存储器容量为 32 个字,字长为 64 位,模块数 m = 4,分别采用顺序方式和交叉方式进行组织。存储周期 T = 200ns,数据总线宽度为 64 位,总线传输周期 r = 50ns。在连续读出 4 个字的情况下,求顺序存储器和交叉存储器各自的带宽。
解:顺序存储器和交叉存储器连续读出 m = 4 个字的信息总量均是: q = 64位 × 4 = 256位
顺序存储器和交叉存储器连续读出 4 个字所需的时间分别是:

t1 = mT = 4 × 200ns = 800ns = 8 × 10-7 s
t2 = T + ( m - 1 ) r = 200ns + 3 × 50ns = 350ns = 35 × 10-8 s
顺序存储器和交叉存储器的带宽分别是:

W1 = q / t1 = 256 / t1 = 32 × 107 b/s

W2 = q / t2 = 256 / t2 = 73 × 107 b/s


05、某一 SRAM 芯片,其容量为 1024 × 8 位,除电源和接地端外,该芯片引脚数目最小为【21】。

解析:芯片容量为 1024 × 8 位,且以字节为单位存取,即地址线数要 10 根,8 位说明数据线要 8 根,加上 片选线 和 读 / 写控制线(读控制为 RD、写控制为 WE),因此引脚数最小为 21 根。
注意:读写控制线也可共用一根,做题时应随机应变。


06、某一 DRAM 芯片,采用地址复用技术,其容量为 1024 × 8 位,除电源和接地端外,该芯片引脚数最少是【17】(读写控制线为两根)。

解析:1024×8位,因此可寻址范围是 1024B = 210B,按字节寻址。采用地址复用技术时,通过行通选和列通选分行、列两次传送地址信号,因此地址线减半为 5 根,数据线仍为 8 根;加上行通选和列通选 及 读 / 写控制线(片选线用行通选代替)4 根,总共是 17 根。
注意 SRAM 和 DRAM 的区别,DRAM 采用地址复用技术,而 SRAM 不采用。


07、某计算机系统,其操作系统保存于硬盘上,其内存储器应该采用【C】。
A. RAM B. ROM C. RAM 和 ROM D. 均不完善
解析:因计算机的操作系统保存于硬盘上,所以需要 BIOS 的引导程序将操作系统引导到主存(RAM)中,而引导程序则固化于ROM中。

ROM 存放系统程序、标准子程序和各类常数;RAM 则是为用户编程而设置。


08、下列说法正确的是【B】。
A. EPROM是可改写的,因此可以作为随机存储器
B. EPROM是可改写的,但不能作为随机存储器
C. EPROM是不可改写的,因此不能作为随机存储器
D. EPROM只能改写一次,因此不能作为随机存储器

解析:EPROM 可多次改写,但改写较为烦琐,写入时间过长,且改写的次数有限,速度较慢,因此不能作为需要频繁读写的 RAM 使用。


09、已知单个存储体的存储周期为 110ns,总线传输周期为 10ns,采用低位交叉编址的多模块存储器时,存储体数应【 ≥ \geq 11】。

解析:为保证第二次启动某个体时,其上次存取操作已完成,存储体的数量应大于等于 11
(110ns / 10ns )。

来源知识点:设模块字长等于数据总线宽度,模块存取一个字的存取周期为 T,总线传送周期为r,为实现流水线方式存取,存储器交叉模块数应大于等于 m = T / r。


10、一个四体并行低位交叉存储器,每个模块的容量是 64K × 32 位,存取周期为 200ns,总线周期为 50ns,在下述说法中,【B】是正确的。
A. 在 200ns 内,存储器能向 CPU 提供 256 位二进制信息
B. 在 200ns 内,存储器能向 CPU 提供 128 位二进制信息
C. 在 50ns 内,每个模块能向 CPU 提供 32 位二进制信息(局部就不一定了)

解析:低位交叉存储器采用流水线技术,它可在一个存取周期内连续访问 4 个模块,32位×4=
128位。
注:本题若作为计算题来考虑,从第一个字的读写请求发出,到第 4 个字读写结束,共需要 350ns,但这里考查的是整体工作性能,可从以下角度理解:
1)连续取 m 个字耗时 t1 = T + (m-1) r,平均每个字的存取时间是 t1 / m,实际工作时 m 非常大,因此 t1 / m 也就非常接近 r ,可认为存储器在每个总线周期 r 都能给 CPU 提供一个字。
2)流水线充分流动起来后,每个总线周期后都能完成一个字的读写,所以本题中每 4 个总线周期(200ns)都能完成 4 个字的读写。


11、某机器采用四体低位交叉存储器,现分别执行下述操作:(1)读取 6 个连续地址单元中存放的存储字,重复 80 次;(2)读取 8 个连续地址单元中存放的存储字,重复 60 次。则(1)、(2)所花的时间之比为【4:3】。

解析假设取指周期为 T,执行周期为 t,总线传输时间为 τ \tau τ

第一种情况,T1 = ( T + ( 6 - 1 ) × τ \tau τ + 6t )× 80 = 80T + 400 τ \tau τ + 480t。

第二种情况,T2 = ( T + ( 8 - 1 ) × τ \tau τ + 8t) × 60 = 60T + 420 τ \tau τ + 480t。

​ 二者之比大约为:4:3

书本中:连续存取 m 个字所需的时间为 t1 = T + ( m - 1 )×r。

( T:存储周期; r:总线传输周期)

对于1:在每轮读取存储器的前 6 个 T/4 时间(共3T/2)内,依次进入各体。下一轮欲读取存储器时,最近访问的M1还在占用中(才过 T/2 时间),因此必须再等待 T/2 的时间才能开始新的读取(M1连续完成两次读取,也即总共 2T 的时间即可进入下一轮。进入下一轮不需要第 6 个字读取结束,第 5 个字读取结束,M1 就已空出,即可马上进入下一轮)。最后一轮读取结束的时间是本轮第 6 个字读取结束,共(6 - 1)x (T / 4) + T = 2.25T。
  情况 1 的总时间为(80 - 1 )x 2T + 2.25T = 160.25T;
对于2:(60-1)x 2T + ( 8 - 1 ) x T/4 +T = 120.75T。


12、假定用若干 16K×8 位的存储芯片组成一个 64K×8 位的存储器,芯片各单元采用交叉编址方式,则地址 BFFFH 所在的芯片的最小地址为【0003H】。

解析:64K×8 位 /16K×8位 = 4,可知芯片数为 4。芯片各单元采用交叉编址,所以每个芯片的片选信号由最低两位地址确定,高 14 位为片内地址。4 个芯片内各存储单元的最低两位地址分别为00、01、10、11。即最小地址分别为 0000H、0001H、0002H、0003H。地址 BFFFH 最低两位为11,因此该存储单元所在芯片的最小地址为 0003H。


13、某计算机使用四体交叉编址存储器,假定在存储器总线上出现的主存地址(十进制)序列为8005,8006,8007,8008,8001,8002,8003,8004,8000,则可能发生访存冲突的地址对是【8004 和 8000】。
解析:每个访存地址对应的存储模块序号(0,1,2,3)如下所示:

访存地址800580068007800880018002800380048000
模块序号123012300

其中,模块序号 = 访存地址 % 存储器交叉模块数。
判断可能发生访存冲突的规则如下:给定的访存地址在相邻的四次访问中出现在同一个存储模块内。 据此,根据上表可知 8004 和 8000 对应的模块号都为 0,即表明这两次的访问出现在同一模块内且在相邻的访问请求中,满足发生冲突的条件。


14、某计算机主存按字节编址,由 4 个 64M x 8 位的 DRAM 芯片采用交叉编址方式构成,并与宽度为 32 位的存储器总线相连,主存每次最多读写 32 位数据。若 double 型变量 x 的主存地址为804 001AH,则读取 x 需要的存储周期数是【3】。

解析:由 4 个 DRAM 芯片采用交叉编址方式构成主存可知主存地址最低二位表示该字节存储的芯片编号。double 型变量占 64 位,8 个字节,即需 8 个存储单元。它的主存地址 0804 001A H最低二位是10,说明它从编号为 2 的芯片开始存储(编号从0开始)。一个存储周期可以对所有芯片各读取一个字节,因此需要3轮。


15、某计算机字长 32 位,存储体的存储周期为 200ns。
1)采用四体交叉工作,用低 2 位的地址作为体地址,存储数据按地址顺序存放。主机最快多长时间可以读出一个数据字(代表要处理的数据二进制位数)?存储器的带宽是多少?
2)若 4 个体分别保存主存中 前1/4、次1/4、再下个 1/4、最后 1/4这四段的数据,即选用高 2 位的地址作为体地址,可以提高存储器顺序读出数据的速度吗?为什么?
3)若把存储器改成单体 4 字宽度,会带来什么好处和问题?
4)比较采用四体低位地址交叉的存储器和四端口读出的存储器这两种方案的优缺点。

:1)因为存取周期是 200ns。四体交叉轮流工作,每两个体间读出操作的延时为 1/4 个存储周期,理想情况是每个存取周期平均可读出 4 个数据字,读出一个数据字的时间平均为 200ns / 4 = 50ns。数据字长为 32 位,数据传输率为 32位 / 50ns = 640Mb/s = 80MB/s(结合第10加深理解)。

2)若对多体结构的存储器选用高位地址交叉,通常起不到提高存储器读写速度的作用,因为它不符合程序运行的局部性原理,一次连续读出彼此地址相差一个存储体容量的 4 个字的机会太少。因此,通常只有一个存储模块在不停地忙碌,其他存储模块是空闲的。

3)若把存储器的字长扩大为原来的 4 倍,实现的则是一个单体 4 字结构的存储器,每次读可以同时读出 4 个字的内容,有利于提高存储器每个字的平均读写速度,但其灵活性不如多体单字结构的存储器,还会多用到几个缓冲寄存器。

4)多端口存储器是对同一个存储体使用多套读写电路实现的,扩大存储容量的难度显然比多体结构的存储器要大,而且不能对多端口存储器的同一个存储单元同时执行多个写入操作,而多体结构的存储器则允许在同一个存储周期对几个存储体执行写入操作。


3.3、连接主存与 CPU

01、 基本知识点:

主存储器通过【数据总线】、【地址总线】和【控制总线】与 CPU 连接。

主存容量的扩展方法:【位扩展(增加存储字长)】、【字扩展(增加字的数量)】、【字位同时扩展】。

位扩展注意:仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某
一时刻选中所有的芯片,所以片选信号要连接到所有芯片。

字扩展注意:仅采用字扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在
某一时刻只选中部分芯片,所以通过片选信号或采用译码器设计连接到相应的芯片。

字位同时扩展注意:采用字位同时扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,而且需要通过片选信号或采用译码器设计连接到相应的芯片。

片选信号的产生分为【线选法(某地址线信息为“0”时,就选中与之对应的存储芯片)】和【译码片选法(高位地址线通过地址译码器芯片产生片选信号)】。

片选有效信号与 CPU 的访存控制信号 M R E Q ‾ \overline{MREQ} MREQ(低电平有效)有关,若 CPU 访问 I/O,则 M R E Q ‾ \overline{MREQ} MREQ 为高,表示不要求存储器工作。


02、 80386DX 是 32 位系统,以 4B 为编址单位,当在该系统中用 8KB(8K×8位)的存储芯片构造 32KB 的存储体时,应完成存储器的【位扩展】设计。

解析:因为以 4B 为编址单位,要扩展到 32KB,即扩展到 8Kx32bit,所以只用进行位扩展。


03、地址总线A0(高位)~ A15(低位),用 4K x 4 位的存储芯片组成 16KB 存储器,则产生片选信号的译码器的输入地址线应该是【A2 A3】。

解析:由于 A15 为地址线的低位,接入各芯片地址端的是地址线的低 12 位,即 A4 ~ A15,共有8 个芯片(16KB / 2KB = 8,且位扩展时每组两片分为 4 组)组成 16KB 的存储器,则由高两位地址线A2 A3 作为译码器的输入。


04、若片选地址为 111 时,选定某一 32K × 16位的存储芯片工作,则该芯片在存储器中的首地址为【38000H】,末地址为【3FFFFH】。

解析:32K × 16 的存储芯片有地址线 15 根(片内地址),片选地址为 3 位,因此地址总位数为18位,现高 3 位为 111,则首地址为 11 1000 0000 0000 0000 = 380000H,末地址为 11 1111 1111 1111 1111 = 3FFFFH。


05、假定用若干 2K×4 位的芯片组成一个 8K×8 位的存储器,则地址 0B1FH 所在芯片的最小地址是【0800H】。

解析:用 2Kx4 位的芯片组成一个 8K×8 位存储器,每行中所需芯片数为 2,每列中所需芯片数为 4,各行芯片的地址分配如下:
第一行(2个芯片并联):0000H~07FFH
第二行(2个芯片并联):0800H~0FFFH
第三行(2个芯片并联):1000H~17FFH
第四行(2个芯片并联):1800H~1FFFH
可知,地址 0B1FH 在第二行,且所在芯片的最小地址为 0800H。


06、 某计算机存储器按字节编址,主存地址空间大小为 64MB,现用 4M×8 位的 RAM 芯片组成32MB 的主存储器,则存储器地址寄存器 MAR 的位数至少是【26】。

解析:主存按字节编址,地址空间大小为 64MB,MAR 的寻址范围为 64M = 226,因此是26位。
实际的主存容量 32MB 不能代表 MAR 的位数,考虑到存储器扩展的需要,MAR应保证能访问到整个主存地址空间;反过来,MAR 的位数决定了主存地址空间的大小。


07、假定 DRAM 芯片中存储阵列的行数为 r、列数为 c,对于一个 2K×1 位的 DRAM 芯片,为保证其地址引脚数最少,并尽量减少刷新开销,则 r、c 的取值分别是【32】,【64】。

解析:根据 DRAM 的结构和原理可知,在分时复用的情况下,芯片引脚个数取决于行地址线和列地址线中的较大值,对于一个 2K×1 位的 DRAM 芯片,总共需要 11 条地址线,只有当一个取 5,一个取 6 时可使管脚数最小,而 DRAM 的刷新开销取决于行数,因此行地址线应该为 5、列地址线为6,即行数 25 = 32,列数为26 = 64。


08、 某计算机的存储器总线中有 24 位地址线和 32 位数据线,按字编址,字长为 32 位。如果 0 0 0000H ~ 3F FFFFH 为 RAM 区。那么需要 512K×8 位的 RAM 芯片数为【32】。

解析:00 0000~3F FFFF,共有 3F FFFFH - 00 0000H + 1H = 40 0000H = 222 个地址,按字编址,字长为 32 位(4B),因此 RAM 区大小为 222 × 4B =2 22 × 32bit。每个 RAM 芯片的容量为
512K×8bit = 219 × 8bit,所以需要 RAM 芯片的数量为【32】。


09、有一组 16K×16 位的存储器,由 1K×4 位的 DRAM 芯片构成。问:
1)共需要多少芯片?
2)采用异步刷新方式,如单元刷新间隔不超过 2ms,则刷新信号周期是多少?

解:1)存储器总容量为 16K×16位,RAM芯片为 1K×4 位,因此所需芯片总数为(16K×16
位)/ (1K×4位)= 64片。
2)采用异步刷新方式,在 2ms 时间内分散地把芯片 64 行刷新一遍,因此刷新信号的时间间隔为 2ms / 64 = 31.25us,即可取刷新信号周期为 31us。
注意:刷新周期也可取 30us,只要小于 31.25us 即可,但通常取刷新间隔的整数部分。


10、某机的主存空间为 64KB,I/O 空间与主存单元统一编址,I/O 空间占用 1KB,范围为FC00H~FFFFH。可选用 8K×8 位和 1K×8 位两种 SRAM 芯片构成主存储器, R D ‾ \overline{RD} RD W R ‾ \overline{WR} WR 分别为系统提供的读写信号线。求每块芯片的地址。

解答:由于 64KB 存储空间中,I/O 占用了最高的 1KB空间(FC00H~FFFFH),RAM 芯片应当分
配余下的低 63KB 空间。选用 7片 8K×8 位芯片和 7片 1K×8 位芯片,共计63KB。
8K×8 RAM 芯片共有 8K 个 8位 的存储单元,片内地址应有 log2(8K) = 13 根,分别连接地址线A12 ~ A0,每片的地址范围为 0000H~1FFFH。
64KB 的存储器应有 64K 个存储单元,地址线应有 log2(64K)= 16根。地址范围为 0000H~
FFFFH。

地址线 A12~A0 并行连接到 7 片 8K×8 位 RAM 芯片的 13 个地址端,用 3 根高地址线 A15、A14、A13 经 3/8 译码器译码,译码器的 7 个输出端(000~110)分别接到 7 片 8K×8 位芯片的片选端,用以选择 7片 8K×8 位芯片中的 1 片。剩下 1 个输出端 111 用以控制另一个3/8译码器。
1K×8 的存储器共有 1K 个存储单元,地址线应有 log2(1K)=10 根。地址范围为 000H~3FFH,地址线A9 ~ A0,共 10 根,并行连接到 7片 1K×8 位 RAM 芯片的 10 个地址端。3 根地址线 A12、A11、A10 经 3/8 译码器译码,译码器的 7 个输出端(000~110)分别接到7片 1K×8 位芯片的片选端,用以选择7片1K×8位芯片中的1片。

在这里插入图片描述


3.4、外部存储器

01、 基础知识点:

硬盘存储器由【磁盘驱动器】、【磁盘控制器】和【盘片】组成。

道密度 是沿磁盘半径方向单位长度上的磁道数,位密度 是磁道单位长度上能记录的二进制代码位数,面密度 是位密度和道密度的乘积。

磁头数:记录面数; 柱面数:硬盘每面盘片上磁道数

平均存取时间寻道时间(磁头移动到目的磁道的时间)、旋转延迟时间(磁头定位到要读写扇区的时间)和 传输时间(传输数据所花费的时间)三部分构成。

RAID0无冗余无校验的磁盘阵列(无容错能力)RAID3位交叉奇偶校验的磁盘阵列
RAID1镜像磁盘阵列RAID4块交叉奇偶校验的磁盘阵列
RAID2采用纠错的海明码的磁盘阵列RAID5无独立校验的奇偶校验磁盘阵列

02、固态硬盘 SSD:基于闪存的存储技术,没有机械部件、随机写比较慢、随机读写性能明显高于磁盘、易磨损。

RAID 将多个物理盘组成像单个逻辑盘,不会影响磁记录密度,也不可能提高磁盘利用率。


03、若磁盘转速为 7200 转 / 分,平均寻道时间为 8ms,每个磁道包含 1000 个扇区,则访问一个扇区的平均存取时间大约是【12.2ms】。

解析:存取时间 = 寻道时间 + 延迟时间 + 传输时间。存取一个扇区的平均延迟时间为旋转半周的时间,即 延迟时间 =( 60 / 7200) / 2 = 4.17ms,传输时间 = (60 / 7200)/ 1000 = 0.01ms,所以访问一个扇区的平均存取时间为: 8 + 4.17 + 0.01 = 12.18ms = 12.2ms。


04、某磁盘的转速为 10000 转 / 分,平均寻道时间是 6ms,磁盘传输速率是 20MB/s,磁盘控制器延迟为 0.2ms,读取一个 4KB 的扇区所需的平均时间约为【9.4ms】。

解析:读取 4KB 扇区信息时间 = 4KB / (20MB /s) = 0.2ms;

​ 平均查询扇区的时间 = (60 / 10000)/ 2 = 3ms;

​ 总时间 = 6 + 3 + 0.2 + 0.2 = 9.4ms。


05、 某个硬磁盘共有 4 个记录面,存储区域内半径为 10cm,外半径为 15.5cm,道密度为 60 道 / cm,外层位密度为 600 bit / cm,转速为 6000 转/分。
1)硬磁盘的磁道总数是多少?
2)硬磁盘的容量是多少?
3)将长度超过一个磁道容量的文件记录在同一个柱面上是否合理?
4)假定每个扇区的容量为 512B,每个磁道有 12 个扇区,寻道的平均等待时间为 10.5ms,试计算磁盘平均存取时间。

解:1 )有效存储区域 = 15.5 - 10 = 5.5cm,道密度 = 60 道 / cm,因此每个面为 60×5.5 = 330道,即有 330 个柱面,因此磁道总数 = 4×330 = 1320 个磁道。

2 )外层磁道的长度为 2 π \pi π R = 2 × 3.14 × 15.5 = 97.34cm。
每道信息量 = 600bit/cm x 97.34cm = 58404 bit = 7300B。
利用 1) 的结果,可得磁盘总容量 = 7300B ×1320 = 9636000B(非格式化容量)。

3 ) 若长度超过一个磁道容量的文件,将它记录在同一个柱面上是比较合理的,因为不需要重新寻找磁道,这样数据读/写速度快。

4 )总时间 = 10.5ms + (60 / 6000)/ 2 + (60 / 6000) / 12 = 16.33ms。


3.5、高速缓冲存储器

01、程序访问的局部性原理

程序访问的局部性原理包括【时间局部性】和【空间局部性】。时间局部性是指在最近的未来要用到的信息,很可能是现在正在使用的信息,因为程序中存在循环。空间局部性是指在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。 LRU体现了局部性原理


02、 CPU 与 Cache(或主存) 之间的数据交换以【字】为单位,而 Cache 与主存之间的数据交换则以 【Cache 块】为单位。

Cache 写命中处理方法:【全写法】、【回写法】;写不命中处理方法:【写分配法】、【非写分配法】。非写分配法通常与全写法合用,写分配法通常和回写法合用。


03、某虚拟存储器系统采用页式内存管理,使用 LRU 页面替换算法,考虑下面的页面访问地址流(每次访问在一个时间单位中完成):1 8 1 7 8 2 7 2 1 8 3 8 2 1 3 1 7 1 3 7。假定内存容量为 4 个页面,开始时是空的,则页面失效率是【30%】。

LRU:最近最久未使用。做题时采用沉淀法,将最久未使用的沉在下面等待被替换。

页1272183821317137
页278827218382131713
页38117788721138223371
页411881111872213882222
命中否000000

04、假设某个计算机的主存地址空间大小为 256MB,按字节编址,其数据 Cache 有 8 个 Cache行行长为 64B(每行存储的数据有 512bit)。
1)若不考虑用于 Cache 的一致维护性和替换算法控制位,并且采用直接映射方式,则该数据 Cache的总容量为多少?
2)若该 Cache 采用直接映射方式,则主存地址为 3200(十进制)的主存块对应的 Cache 行号是多少?采用二路组相联映射时又是多少?

解:1)数据 Cache 的总容量为 4256 位。Cache 的总容量包括:存储容量、标记阵列容量(有效位、标记位)(标记阵列中的一致性维护位和 Cache 数据一致性维护方式相关,替换算法控制位和替换算法相关,这里不计算)。

标记字段长度的计算:主存地址有 28 位( 256MB = 228 B),其中 6 位为块内地址(26 B = 64B),3 位为行号(23 = 8),剩余 28 - 6 - 3 = 19 位为标记字段,总容量为 8 ×(1 + 19 + 512)= 4256位。

注意:每个 Cache 行对应一个标记项(包括有效位标记位 Tag、一致性维护位、替换算法控制位),而在组相联中,将每组的标记项排成一行,将各组从上到下排列,成为一个二维的标记阵列(直接映射一行就是一组)。查找 Cache 时就是查找标记阵列的标记项是否符合要求。

2)直接映射方式中,主存按照块的大小划分,主存地址 3200 对应的字块号为 3200B/64B=50。而 Cache 只有 8 行,则 50 mod 8 = 2,因此对应的 Cache 行号为 2。
二路组相联映射方式,实质上就是将两个 Cache 行合并(组数为 4),内部采用全相联方式,外部采用直接映射方式,50 mod 4 = 2,对应的组号为 2,即对应的 Cache 行号为 4或 5。


05、某存储系统中,主存容量是 Cache 容量的 4096 倍,Cache 被分为 64 个块,当主存地址和Cache 地址采用直接映像方式时,地址映射表的大小应为【】(不考虑一致维护和替换算法位)

解析:地址映射表即标记阵列,由于 Cache 被分为 64 个块,则 Cache 有 64 行,采用直接映射,一行相当于一组。因此标记阵列每行存储 1 个标记项,其中主存标记项为 12 位(212 = 4096,是 Cache 容量的 4096 倍,即地址长度比 Cache 长 12 位),加上 1 位有效位,因此为 64×13位


06、有一主存-Cache 层次的存储器,其主存容量为 1MBCache 容量为 16KB每块有 8 个字,每字 32 位,采用直接地址映像方式,Cache 起始字块为第 0 块,若主存地址为 35301H,且CPU访问 Cache 命中,则在 Cache 的第【152】(十进制表示)字块中。

解析:先写出主存地址的二进制形式,然后分析 Cache 块内地址、Cache 字块地址和主存字块标记。主存地址的二进制数 0011 0101 0011 0000 0001,根据直接映射的地址结构,字块内地址为低 5位(每字块含32B,25 = 32,因此为5位),主存字块标记为高 6 位(1MB/16KB = 64,26 = 64,因此为 6位),其余 01 0011 000 即为 Cache 字块地址,转换为十进制数 152。


07、假定主存地址为 32 位,按字节编址,主存和 Cache 之间采用直接映射方式,主存块大小为4 个字,每字 32 位,采用回写方式,则能存放 4K 字数据的 Cache 的总容量的位数至少是【148K】

解析:直接映射的地址结构为: 主存字块标记 | Cache字块标记(行号) | 字块内地址

按字节编址,块大小为 4×32位 = 16B = 24 B,则 “字块内地址” 占 4 位;“能存放 4K 字数据的Cache”即 Cache 的存储容量为 4K字(注意单位),则 Cache 共有 1K = 210 个 Cache 行,Cache 字块标记占 10 位;主存字块标记占 32 - 10 - 4 = 18位。
Cache 总容量包括:存储容量和标记阵列容量(有效位、标记位、一致性维护位和替换算法控制位)。标记阵列中的有效位和标记位一定存在,而一致性维护位(脏位)和替换算法控制位的取舍标准是看词眼,题目中明确说明了采用回写法,则一定包含一致性维护位,而关于替换算法的词眼题目中未提及,所以不予考虑。因此,每个 Cache 行标记项包含 18+1+1 = 20位,标记阵列容量为 210× 20位 = 20K位,存储容量为 4K×32位 = 128K位,总容量为128K+20K = 148K位。


08、有效容量为 128KB 的 Cache,每块 16B,采用 8 路组相联。字节地址为 1234567H 的单元调入该 Cache,则其 Tag 应为【048DH】。

解析:块大小为 16B,所以块内地址字段为 4位Cache 容量为 128KB,采用 8 路组相联,共有
128KB / (16B × 8)= 1024 组,组号字段为 10 位;剩下的为标记字段。1234567H 转换为二进制数
0001 0010 0011 0100 0101 0110 0111H,标记字段对应高 14 位,即 048DH。

组相联映射的地址结构:标记 | 组号 | 块内地址 Cache 组号 = 主存块号 mod Cache组数


09、假设主存按字节编址,Cache 共有 64 行,采用四路组相联映射方式,主存块大小为 32 字节,所有编号都从 0 开始。则第 2593 号存储单元所在主存块的组号是【1】。

解析:主存块大小为 32 字节(Cache 块大小也为 32 B),按字节编址,故块内地址占 5 位。采用四路组相联映射方式,共 64 行,分 64/4 = 16组,故组号占 4 位。因为 2593 = 0······0101 0001 00001,根据主存地址划分的结果,可以看出第 2593 号存储单元所在主存块的 Cache 组号为0001。


10、若主存地址位数为 32 位,按字节编址,主存和 Cache 之间采用全相联映射方式,主存块大小为 1 个字,每字 32 位,采用 回写(writeback)方式和随机替换策略,则能存放 32K 字(32K行)数据的 Cache 的总容量至少应有【2048K】位。

解析:主存块大小为 1 个字,即 32 位,按字节编址,故块内地址占 2 位。在全相联映射方式下,主存地址只有两个字段,故标志占 32 - 2 = 30位。因采用回写法,故需 1 位修改位;因为采用随机替换策略,故无须替换控制位。每个 Cache 行的总位数为 32bit(数据位)+ 30bit(tag位)+ 1bit(修改位)+1bit(有效位)= 64bit。综上,Cache 总容量至少应有 32Kx64bit=2048Kbit。

回写式:每个标记项加一个一致性控制位(脏位)。全写法不用。

四路组相联 Cache 使用 LRU 算法的替换控制位为 2 位。(8路的话就是 3 位)


11、若主存地址位数为32位,按字节编址,Cache 数据区大小为 32KB,主存块大小为 32B,采用直接映射方式和回写(WriteBack)策略,则 Cache 行的位数至少是 【275】。

解析:Cache 数据区大小为 32KB,主存块的大小为 32B,那么 Cache 中共有 1K 个 Cache行。因为采用直接映射方式,所以 1K 个 Cache 行映射到 1K 个分组,物理地址中组号部分的长度 10bit。32bit 的主存地址除去 5bit 的块内地址 和 10bit 的组号后,还剩 17 bit的 tag 部分。又因为 Cache 采用回写法,所以 Cahce 行的总位数应为 32B(数据位)+ 17bit(tag位)+1bit(修改位)+1bit(有效位)= 275bit。


12、有如下C语言程序段:

for( k = 0; k<1000;k++) a[k] = a[k] + 32;

若数组 a 和变量 k 均为 int 型,int 型数据占 4B,数据 Cache 采用直接映射方式,数据区大小为1KB、块大小为 16B,该程序段执行前 Cache 为空,则该程序段执行过程中访问数组 a 的 Cache 缺失率约为【12.5%】。

解析:a[k]的访问步骤是:先访问 cache,cache 缺失,之后从主存中取出一个块调入 cache,这个块中的后几个数据都是命中的,本题中一个数据占 4B,一个块大小是 16B,这说明一个块中有 4 个数据,关键是后面还有一次写,这说明一次循环要八次访问cache,其中只有第一次是缺失的,后面七次都是命中的,所以缺失率是 12.5%;


13、假设某计算机按字编址,Cache 有 4 行,Cache 和主存之间交换的块大小为 1 个字,若Cache 的内容初始为空,采用二路组相联映射方式和 LRU 替换策略,则访问的主存地址依次为 0,4,8,2,0,6,8,6,4,8 时,命中 Cache 的次数是【3】。

解析:地址映射采用二路组相联,主存地址为 0~1、4~5、8~9 可映射到第 0 组 Cache 中,主存地址为 2~3、6~7 可映射到第 1 组 Cache 中。Cache 置换过程如下表所示。

在这里插入图片描述


14、假定 CPU 通过存储器总线读取数据的过程为:发送地址和读命令需 1 个时钟周期存储器准备一个数据需 8 个时钟周期总线上每传送 1 个数据需 1 个时钟周期。若主存和 Cache 之间交换的主存块大小为 64B存取宽度和总线宽度都为 8B,则 Cache 的一次缺失损失至少为【80】个时钟周期。

解析:一次缺失损失需要从主存读出一个主存块(64B),每个总线事务读取 8B,因此需要 8 个总线事务。每个总线事务所用的时间为 1+8+1 = 10 个时钟周期,共需要 80 个时钟周期。

若题目中说支持突发传送,比如每个时钟周期总线上传送1个数据,可连续传送8个数据(即突发长度为 8),则 Cache 的一次缺失损失至少为【1 + 8 + 8 = 17】个时钟周期。


15、某 32 位计算机,CPU 主频为 800MHz,Cache 命中时的 CPI 为 4,Cache 块大小为 32B;主存采用 8 体交叉存储方式,每个体的存储字长为 32 位存储周期为 40ns存储器总线宽度为 32 位总线时钟频率为 200MHz,支持突发传送总线事务。每次读突发传送总线事务的过程包括:送首地址和命令、存储器准备数据、传送数据。每次突发传送 32B,传送地址或 32位 数据均需要一个总线时钟周期。请回答下列问题,要求给出理由或计算过程。
1)CPU 和总线的时钟周期各为多少?总线的带宽(即最大数据传输率)为多少?
2)Cache 缺失时,需要
用几个读突发传送总线事务
来完成一个主存块的读取?
3)存储器总线完成一次读突发传送总线事务所需的时间是多少?
4)若程序 BP 执行过程中共执行了100条指令,平均每条指令需进行1.2次访存,Cache 缺失率为 5%,不考虑替换等开销,则 BP 的 CPU 执行时间是多少?

解析:1)CPU 的时钟周期是主频的倒数,即 1/800MHz = 1.25ns。
总线的时钟周期是总线频率的倒数,即 1/200MHz = 5ns。
总线宽度为32位,因此总线带宽为 4Bx200MHz=800MB/s 。

总线带宽指这条总线在单位时间内可以传输的数据总量,它等于总线位宽与工作频率的乘积。

2)Cache 块大小是 32B,因此 Cache 缺失时需要一个读突发传送总线事务读取一个主存块

3)一次读突发传送总线事务包括一次地址传送和 32B 数据传送:用 1 个总线时钟周期传输地址;每隔 40ns / 8 = 5ns 启动一个体工作(各进行 1 次存取),第一个 体读数据花费 40ns,之后数据存取与数据传输重叠;用 8 个总线时钟周期传输数据。读突发传送总线事务时间为 5ns + 40ns + 8*5ns = 85ns。

4)一条指令的平均 CPU 执行时间包括 Cache 命中时的指令执行时间和 Cache 缺失时带来的额外开销。 Cache 命中时的一条指令执行时间 = Cache 命中时的 CPI × 时钟周期 = 4×1.25ns = 5ns。

一条指令执行过程中因 Cache 缺失而导致的平均额外开销 = 平均访存次数 x Cache缺失率 × 一次读突发传送总线事务时间 = 1.2×5%×85ns = 5.1ns。

一条指令的平均 CPU 执行时间 = 5ns+5.1ns = 10.1ns。BP 的 CPU 执行时间 = 一条指令的平均CPU 执行时间×指令条数 = 10.1ns × 100 = 1010ns。


16、假定主存地址为 32 位,按字节编址,指令 Cache数据 Cache 与主存之间均采用 8 路组相联映射方式,直写(WriteThrough)写策略和 LRU 替换算法,主存块大小为 64B数据区容量各为 32KB。开始时 Cache 均为空。请回答下列
问题。
1)Cache 每一行中标记(Tag)、LRU位各占几位?是否有修改位?
2)有如下 C 语言程序段:
for( k =0;k<1024;k++)
s[k] = 2 * s[k];
若数组 s 及其变量 k 均为 int 型,int 型数据占 4B,变量 k 分配在寄存器中,数组 s 在主存中的起始地址为 0080 00C0H,则在该程序段执行过程中,访问数组 s 的数据 Cache 缺失次数为多少?
3)若 CPU 最先开始的访问操作是读取主存单元 0001 0003H中的指令,简要说明从 Cache 中访问该指令的过程,包括 Cache 缺失处理过程。

在这里插入图片描述


3.6、虚拟存储器

01、虚拟存储系统利用的是局部性原理,程序应当具有较好的局部性; 输入、输出操作产生中断,与虚存无关; 大小较小但可以多个程序并发执行,也可以发挥虚存的作用; 顺序执行的指令应当占较大比重为宜,这样可增强程序的局部性。

02虚拟存储管理系统的基础是程序访问的局部性原理,此理论的基本含义是【在程序的执行过程中,程序对主存的访问是不均匀的】(程序只能访问主存获得指令和数据)。

03页式虚拟存储方式对程序分页采用页进行交互段页式则先按照逻辑分段,然后分页以页为单位和主存交互

04、在虚拟存储器中,当程序正在执行时,由【操作系统】完成地址映射。(需要一部分硬件基础的支持,如快表、地址映射系统等)

05、采用虚拟存储器的主要目的是【扩大主存储器的存储空间】。

06、缺页处理完成后回到发生缺页的指令继续执行。


07、下列命令组合的一次访存过程中,不可能发生的是【D】。
A. TLB 未命中,Cache未命中,Page未命中
B. TLB 未命中,Cache命中,Page命中
C. TLB 命中,Cache未命中,Page命中
D. TLB 命中,Cache命中,Page未命中

解析:TLB 缓存的页表就是来自 Page,所以 TLB命中,那肯定Page也命中。

​ TLB、Page、Cache 三种缺失的可能组合情况

序号TLBPageCache说明
1命中命中命中TLB 命中则 Page一定命中,信息在主存,就可能在 Cache 中
2命中命中缺失TLB 命中则 Page一定命中,信息在主存,也可能不在 Cache 中
3缺失命中命中TLB 缺失但 Page可能命中,信息在主存,就可能在 Cache 中
4缺失命中缺失TLB 缺失但 Page可能命中,信息在主存,也可能不在 Cache 中
5缺失缺失缺失TLB 缺失则 Page可能也缺失,信息不在主存,就一定不在 Cache 中

08、某计算机主存地址空间大小为 256MB,按字节编址。虚拟地址空间大小为 4GB,采用页式存储管理,页面大小为 4KB,TLB(快表)采用全相联映射,有 4 个页表项,内容如下表所示。

有效位标记页框号
0FF180H0002H
13FFF1H0035H
002FF3H0351H
103FFFH0153H

则对虚拟地址 03FFF180H 进行虚实地址变换的结果是【015 3180H】。

解析:按字节编址,页面大小为 4KB,页内地址共 12位。地址空间大小为4GB,虚拟地址共 32位,前 20 位为页号。虚拟地址为 03FFF180H,因此页号为 03FFFH,页内地址为 180H。查找页标记03FFFH 所对应的页表项,页框号为 0153H,页框号与页内地址拼接即为物理地址 015 3180H。


09、设有 8 页的逻辑空间,每页有 1024B,它们被映射到 32 块的物理存储区中,则按字节编址逻辑地址的有效位是【13】物理地址至少是【15】位。

解析:对于逻辑地址,因为 8 = 23 页,所以表示页号的地址有 3 位,又因为每页有 1024 = 210 B,所以页内地址有 10 位,因此逻辑地址共 13 位。
对于物理地址,块内地址和页内地址一样有 10 位,内存至少有 32 = 25 个物理块,所以表示块号的地址至少有 5 位,因此物理地址至少有 15 位。


10、假设计算机 M 的主存地址为 24 位,按字节编址;采用分页存储管理方式,虚拟地址为 30位,页大小为 4KB;TLB 采用二路组相联方式和 LRU 替换策略,共 8 组。请回答下列问题。
1)虚拟地址中哪几位表示虚页号?哪几位表示页内地址?
2)已知访问 TLB 时虚页号高位部分用作 TLB 标记,低位部分用作 TLB 组号,M 的虚拟地址中哪几位是 TLB 标记?哪几位是 TLB 组号?
3)假设 TLB 初始时为空,访问的虚页号依次为 10,12,16,7,26,4,12和20,在此过程中,哪一个虚页号对应的 TLB 表项被替换?说明理由。
4)若将 M 中的虚拟地址位数增加到 32 位,则 TLB 表项的位数增加几位?

答:1)按字节编址,页面大小为 4KB = 212 B,页内地址为 12 位。虚拟地址中高 30 - 12 = 18位
表示虚页号,虚拟地址中低 12 位表示页内地址。
2)TLB 采用二路组相联方式,共 8 = 23 组,用 3 位来标记组号。虚拟地址(或虚页号)中高 18 - 3 = 15 位为 TLB 标记,虚拟地址中随后 3 位(或虚页号中低 3 位)为 TLB 组号。

3)虚页号 4 对应的 TLB 表项被替换。因为虚页号与 TLB 组号的映射关系为 TLB 组号 = 虚页号 mod TLB组数 = 虚页号 mod 8,因此,虚页号 10,12,16,7,26,4,12,20 映射到的 TLB 组号依次为 2,4,0,7,2,4,4,4。TLB 采用二路组相联方式,从上述映射到的 TLB 组号序列可以看出,只有映射到 4 号组的虚页号数量大于 2,相应虚页号依次是 12,4,12 和 20。根据 LRU 替换策略,当访问第 20 页时,虚页号 4 对应的 TLB 表项被替换出来。
4)虚拟地址位数增加到 32 位时,虚页号增加了 32 - 30 = 2位,使得每个 TLB 表项中的标记字段增加 2 位,因此,每个 TLB 表项的位数增加 2 位。


3.7、简答题

01、存取周期和存取时间有何区别?
存取周期和存取时间的主要区别是:存取时间仅为完成一次操作的时间;而存取周期不仅包含操作时间,而且包含操作后线路的恢复时间,即存取周期 = 存取时间+恢复时间。


02、在虚拟存储器中,页面是设置得大一些好还是设置得小一些好?
页面不能设置得过大,也不能设置得过小。因为页面太小时,平均页内剩余空间较少,可节省存储空间,但会使得页表增大,而且页面太小时不能充分利用访存的空间局部性来提高命中率;页面太大时,可减少页表空间,但平均页内剩余空间较大,会浪费较多存储空间,页面太大还会使页面调入/调出的时间较长。


03、发生取指令 Cache 缺失的处理过程是什么?
1)程序计数器恢复当前指令的值。
2)对主存进行读的操作。
3)将读入的指令写入 Cache 中,更改有效位和标记位。
4)重新执行当前指令。


04、假定某处理器可通过软件对高速缓存设置不同的写策略,则在下列两种情况下,应分别设置成什么写策略?为什么?
1)处理器主要运行包含大量存储器写操作的数据访问密集型应用。
2)处理器运行程序的性质与1)相同,但安全性要求高得多,不允许有任何数据不一致的情况发生。

回写法(WriteBack)减少了访存次数,但存在不一致的隐患。因此若题目中出现了“较高的安全要求”,则尽量要使用写直通法(WriteThrough)。
1)采用 WriteBack 策略较好,可减少访存次数。
2)采用 WriteThrough 策略较好,能保证数据的一致性。


4、指令系统


4.1、指令格式

01、三地址指令:若地址字段均为主存地址,则完成一条三地址需要 4 次访问存储器(取指令 1次,取两个操作数 2次,存放结果 1次)。

02、以下有关指令系统的说法中,错误的是【D】。
A. 指令系统是一台机器硬件能执行的指令全体
B. 任何程序运行前都要先转换为机器语言程序
C. 指令系统是计算机软/硬件的界面
D. 指令系统和机器语言是无关的

解析:指令系统是计算机硬件的语言系统,这显然和机器语言有关。


03、堆栈计算机中,有些堆栈零地址的运算类指令在指令格式中不给出操作数的地址,参加的两个操作数来自【堆栈的栈顶和次栈顶单元】。

解析:零地址的运算类指令又称堆栈运算指令,参与的两个操作数来自栈顶和次栈顶单元。
注意:堆栈指令的访存次数,取决于采用的是软堆栈还是硬堆栈。若是软堆栈(堆栈区由内存实现),则对于双目运算需要访问 4 次内存:取指、取源数1、取源数2、存结果。若是硬堆栈(堆栈区由寄存器实现),则只需在取指令时访问一次内存。


04、以下叙述错误的是【B】。
A. 为了便于取指,指令的长度通常为存储字长的整数倍
B. 单地址指令是固定长度的指令
C. 单字长指令可加快取指令的速度
D. 单地址指令可能有一个操作数,也可能有两个操作数

解析:指令的地址个数与指令的长度是否固定没有必然联系,即使是单地址指令也可能由于单地址的寻址方式不同而导致指令长度不同。


05、 一个计算机系统采用 32 位单字长指令,地址码为 12 位,若定义了 250 条二地址指令,则还可以有【24K】条单地址指令。

解析:地址码为 12 位,二地址指令的操作码长度为 32 - 12 - 12 = 8位,已定义了 250 条二地址指令,28 - 250 =6,即可以设计出单地址指令 6×212 = 24K 条。


06、某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令 29 条、二地址指令 107 条,每个地址字段为 6 位,则指令字长至少应该是【24位】。
解析:三地址指令有 29 条,所以其操作码至少为 5 位。以 5 位进行计算,它剩余 25 - 29 = 3种操作码给二地址。而二地址另外多了 6 位给操作码,因此其数量最大达 3×64=192。所以指令字长最少为 23 位,因为计算机按字节编址,需要是 8 的倍数,所以指令字长至少应该是 24 位。


07、假设指令字长为 16 位,操作数的地址码为 6 位,指令有零地址、一地址、二地址 3 种格式。

1)设操作码固定,若零地址指令有 M 种,一地址指令有 N 种,则二地址指令最多有几种?
2)采用扩展操作码技术,二地址指令最多有几种?
3)采用扩展操作码技术,若二地址指令有 P 条,零地址指令有 Q 条,则一地址指令最多有几种?

答:1)根据操作数地址码为 6 位,得到二地址指令中操作码的位数为 16 - 6 - 6 = 4,这 4 位操作码可有 16 种操作。由于操作码固定,因此除了零地址指令有 M 种,一地址指令有 N 种,剩下的二地址指令最多有 16 - M - N 种。

2)采用扩展操作码技术,操作码位数可随地址数的减少而增加。对于二地址指令,指令字长 16位,减去两个地址码 12位,剩下 4 位操作码,共 16 种编码,去掉一种编码(如111)用于一地址指令扩展,二地址指令最多可有 15 种操作。

3)采用扩展操作码技术,操作码位数可变,二地址、一地址和零地址的操作码长度分别为 4位、10 位和 16 位。这样,二地址指令操作码每减少一个,就可以多构成 26 条一地址指令操作码;一地址指令操作码每减少一个,就可以多构成 26 条零地址指令操作码。

设一地址指令有 R 条,则一地址指令最多有(24 - P)× 26 条,零地址指令最多有[ (24 - P)×26 - R]×26 条。

补充:

在设计扩展操作码指令格式时,必须注意以下两点:
1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
2)各指令的操作码一定不能重复。


4.2、指令的寻址方式

本节可参考博客:计算机组成原理——指令系统(课程笔记)

01、基本知识点:

EA = (A)意思是有效地址是地址 A 中的数值。

数据寻址的指令格式:操作码 | 寻址特征 | 形式地址 A

指令系统中采用不同寻址方式的目的是【缩短指令字长,扩大寻址空间,提高编程的灵活性】

相对寻址方式中,指令所提供的相对地址实质上是一种【以下条指令在内存中首地址为基准位置的偏移量】。(EA =(PC) + A,执行本条指令时,PC 已完成加 1 操作(已自动更新),PC 中保存的是下一条指令的地址)

在多道程序设计中,最重要的寻址方式是【相对寻址】。

指令字中的形式地址为操作数的有效地址,这种方式为【直接寻址】。

寻址方式有效地址访存次数
隐含寻址程序指定0
立即寻址A 即是操作数0
直接寻址EA = A1
一次间接寻址EA =(A)2
寄存器寻址EA =Ri0
寄存器间接一次寻址EA =(Ri)1
相对寻址(程序浮动)EA =(PC) + A1
基址寻址EA =(BR) + A1
变址寻址(数组)EA =(IX) + A1

02、某机器指令字长为 16 位,主存接字节编址,取指令时,每取一字节,PC 自动加1。当前指令地址为 2000H,指令内容为相对寻址的无条件转移指令,指令中的形式地址为 40H。则取指令后指令执行后 PC 的内容为【2002H,2042H】。

解析:指令字长为16位,2字节,因此取指令后PC的内容为(PC)+ 2 = 2002H;无条件转移指令将下一条指令的地址送至 PC,形式地址为 40H,指令执行后 PC=2002H + 0040H=2042H。


03、对按字寻址的机器,程序计数器指令寄存器位数各取决于【存储器的字数】、【指令字长】。

解析:机器按字寻址,程序计数器(PC)给出下一条指令字的访存地址(指令在内存中的地址),因此取决于存储器的字数;指令寄存器(IR) 用于接收取得的指令,因此取决于指令字长。


04、假设某条指令的第一个操作数采用寄存器间接寻址方式,指令中给出的寄存器编号为 8,8号寄存器的内容为 1200H,地址为 1200H 的单元中的内容为 12FCH,地址为 12FCH 的单元中的内容为 38D8H,而地址为 38D8H 的单元中的内容为 88F9H,则该操作数的有效地址为【1200H】。
解析:寄存器间接寻址中操作数的有效地址 EA =(Ri),8 号寄存器内容为 1200H,因此 EA =
1200H。

特别注意:有效地址的内容即为要访问到的操作数。Ri 给出的是操作数所在主存单元的地址,即 EA = ( R i )


05、假设变址寄存器 R 的内容为 1000H指令中的形式地址为 2000H;地址 1000H 中的内容为2000H,地址 2000H 中的内容为 3000H,地址 3000H 中的内容为 4000H,则变址寻址方式下访问到的操作数是【4000H】。

解析:根据变址寻址的方法,变址寄存器的内容(1000H)与 形式地址的内容(2000H)相加,得到操作数的实际地址(3000H),根据实际地址访问内存,获取操作数 4000H。


06、设相对寻址的转移指令占 3B,第一字节为操作码,第二、三字节为相对位移量(补码表示),而且数据在存储器中采用以低字节为字地址的存放方式。每当 CPU 从存储器取出一字节时,即自动完成**(PC)+ 1 --> PC**。若 PC 的当前值为 240(十进制),要求转移到 290(十进制),则转移指令的第二、三字节的机器代码是【2FH 00H】;若 PC 的当前值为 240(十进制),要求转移到 200(十进制),则转移指令的第二、三字节的机器代码是【D5H FFH】。

解析:补码的扩充:正数补码的扩充只需补0,负数补码的扩充只需补1。
1)PC 的当前值为 240,该指令取出后 PC 的值为 243,要求转移到 290,即相对位移量为 47,转换成补码为 2FH。由于数据在存储器中采用以低字节地址为字地址的存放方式,因此该转移指令的第二字节为 2FH,由于 47 是正数,因此只需在高位补 0,所以第三字节为 00H。
2)PC 的当前值为 240,该指令取出后 PC 的值为 243,要求转移到 200,即相对位移量为 -43,转换成补码为 D5H。由于数据在存储器中采用以低字节地址为字地址的存放方式,因此该转移指令的第二字节为D5H,由于 -43是负数,因此只需在高位补 1,所以第三字节为 FFH。


07、某机器有一个标志寄存器,其中有进位/借位标志CF、零标志ZF、符号标志 SF 和溢出标志OF,条件转移指令bgt(无符号整数比较,大于时转移)的转移条件是【 C F + Z F ‾ \overline{CF+ZF} CF+ZF = 1】。

解析:假设两个无符号整数 A 和 B,bgt 指令会将 A 和 B 进行比较,也就是将 A 和 B 相减。若 A > B,则 A - B 肯定无进位/借位,也不为0(为0时表示两数相等),因此 CF 和 ZF 均为 0。


08、某计算机有 16 个通用寄存器,采用 32 位定长指令字操作码字段(含寻址方式位)为 8位,Store 指令的源操作数目的操作数分别采用寄存器直接寻址基址寻址方式。若基址寄存器可使用任一通用寄存器,且偏移量用补码表示,则 Store 指令中偏移量的取值范围是【-32768 ~+32767】。

解析:采用 32 位定长指令字,其中操作码为 8 位,两个地址码共占用 32 - 8 = 24位,而 Store指令的源操作数和目的操作数分别采用寄存器直接寻址基址寻址,机器中共有 16 个通用寄存器,因此寻址一个寄存器需要 log2 16 = 4位,源操作数中的寄存器直接寻址用掉 4 位,而目的操作数采用基址寻址也要指定一个寄存器,同样用掉 4 位,则留给偏移量的位数为 24 - 4 - 4 = 16位,而偏移量用补码表示,因此 16 位补码的表示范围为 -32768 ~+32767。


09、某计算机采用大端方式,按字节编址。某指令中操作数的机器数为 1234 FF00H,该操作数采用基址寻址方式,形式地址(用补码表示)为 FF12H,基址寄存器的内容为 F000 0000H,则该操作数的 LSB(最低有效字节)所在的地址是【EFFF FF15H】。

解析:考察补码运算,寻址,大、小端。
FF12 = 1111 1111 0001 0010–>- 0000 0000 1110 1101+1 = - 0000 0000 1110 1110 = -00EE
-00EE+F000 0000=EFFF FF12
大端方式,低地址存高位,即所求地址为 EFFF FF12 + 3 = EFFF FF15 。
扩展:大端,即存储顺序和阅读顺序一致(网络字节序),如 10(int)为 000A ,小端,即和大端相反的存储顺序,如10(int)为 A000 ,写法中,从左到右为地址增加的方向,也即地址为左侧第一个字节的地址。

错因分析:内存地址是无符号数,视作一个二进制数串,不是什么原码、补码表示。形式地址就是偏移量,补码表示时,要翻译成原码,并且除去符号位后,剩下的才可视为二进制数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiZR7tm7-1657781396113)(https://uploadfiles.nowcoder.com/images/20210722/526271640_1626940419118/C5E5D163D82E6AD5D05C6884B16AB8D0)]

参考博客:计算机考研408题集 大/小端方式 LSB最低有效位和MSB最高有效位


10、某计算机采用 16 位定长指令字格式操作码位数和寻址方式位数固定,指令系统有 48 条指令,支持直接、间接、立即,相对 4 种寻址方式。在单地址指令中,直接寻址方式的可寻址范围是【0~255】。

解析:48 条指令需要 6 位操作码字段(25 <48<26),4 种寻址方式需要 2 位寻址特征位,还剩16 - 6 - 2 = 8 位作为地址码,故直接寻址范围为 0~255。注意,主存地址不能为负。


4.3、程序的机器级代码表示

4.3.1、常用汇编指令介绍
1、相关寄存器

(除 EBP 和 ESP 外,其他几个寄存器的用途是比较任意的)

在这里插入图片描述

2、汇编指令格式

在这里插入图片描述

3、常用指令
  • <reg>:表示任意寄存器,若其后带有数字,则指定其位数,如表示32位寄存器。
  • <mem>:表示内存地址(如[eax]、[var+4] 或 dword ptr[eax+ebx])。
  • <con>:表示 8 位、16 位或 32 位常数。 表示 8 位常数。
(1)数据传送指令

1)mov 指令:将第二个操作数(寄存器的内容、内存中的内容 或 常数值)复制到第一个操作数(寄存器 或 内存)。但不能用于直接从内存复制到内存

语法如下:
	mov <reg>,<reg>			mov <reg>,<mem>		mov <reg>,<con>
	mov <mem>,<reg>			mov <mem>,<con>
举例:
	mov eax,ebx    			# 将 ebx 值复制到 eax
	mov byte ptr [var], 5   # 将 5 保存到 var 值指示的内存地址的一字节中

2)push 指令 :将操作数压入内存的栈,常用于函数调用。ESP 是栈顶,压栈前先将 ESP值减4(栈增长方向与内存地址增长方向相反),然后将操作数压入 ESP 指示的地址。

语法如下:
	push <reg32>		push <mem>		push <con32>
举例:(栈中元素固定为 32 位)
	push eax		# 将 eax 值压栈
	push [var]		# 将 var 值指示的内存地址的 4 字节值压栈

3)pop 指令: 执行出栈工作,出栈前先将 ESP 指示的地址中的内容出栈,然后将 ESP 值加 4。

语法如下:
	pop edi			# 弹出栈顶元素送到 edi
	pop [ebx]		# 弹出栈顶元素送到 ebx 值指示的内存地址的 4 字节中
(2)算术和逻辑运算指令

1)add / sub 指令:add 指令将两个操作数相加,相加的结果保存到第一个操作数中。sub 指令用于两个操作数相减,相减的结果保存到第一个操作数中。

语法如下:
    add	<reg>,<reg> / sub <reg>,<reg>
	add <reg>,<mem> / sub <reg>,<mem>
    add <reg>,<con> / sub <reg>,<con>
	add <mem>,<reg> / sub <mem>,<reg>
	add <mem>,<con> / sub <mem>,<con>
举例:
    sub eax,10
    add byte ptr [var],10 # 10与var值指示的内存地址的一字节值相加,并将结果
保存在var值指示的内存地址的字节中

2)inc/dec 指令:分别表示将操作数自加 1、自减 1。

语法如下:
    inc <reg> / dec <reg>
    inc <mem> / dec <mem>
举例:
    dec eax    # eax 值自减 1
    inc dword ptr [var]    # var值指示的内存地址的4字节值自加 1

3)imul 指令:带符号整数乘法指令,有两种格式.a. 两个操作数,将两个操作数相乘,将结果保存在第一个操作数中,第一个操作数必须为寄存器;b. 三个操作数,将第二个和第三个操作数相乘,将结果保存在第一个操作数中,第一个操作数必须为寄存器

语法如下:
    imul <reg32>,<reg32>
	imul <reg32>,<mem>
	imul <reg32>,<reg32>,<con>
	imul <reg32>,<mem><con>
举例:
    imul eax,[var] 		imul esi,edi,25
乘法操作结果可能溢出,则编译器置溢出标志 OF=1,以使 CPU 调出溢出异常处理程序

4)idiv 指令:带符号整数除法指令,它只有一个操作数,即除数,而被除数则为 edx:eax 中的内容(64位整数),操作结果有两部分:商和余数,商送到 eax,余数送到 edx。

语法如下:
    idiv <reg32>	idiv <mem>
举例:
    idiv ebx		idiv dword ptr [var]

5)and/or/xor 指令:分别是逻辑与、逻辑或、逻辑异或 操作指令,用于操作数的位操作,操作结果放在第一个操作数中。

语法如下:
    and	<reg>,<reg> / or <reg>,<reg>
	and <reg>,<mem> / or <reg>,<mem>
    and <reg>,<con> / or <reg>,<con>
	and <mem>,<reg> / or <mem>,<reg>
	and <mem>,<con> / or <mem>,<con>
举例:
    xor edx,edx    # 置edx中的内容为0
    and eax,0fH    # 将eax中的前 28 位全部置为 0,最后 4 位保持不变

6)not 指令:位翻转指令,将操作数中的每一位翻转,即 0–>1,1–>0。

语法如下:
    not <reg>	not <mem>
举例:
    not byte ptr [var] # 将var值指示的内存地址的一字节的所有位翻转

7)shl / shr 指令:逻辑移位指令,shl 为逻辑左移,shr 为逻辑右移,第一个操作数表示被操作数,第二个操作数指示移位的位数。

语法如下:
    shl / shr <reg>,<con8>
	shl / shr <mem>,<con8>
	shl / shr <reg>,<cl>
	shl / shr <mem>,<cl>
举例:
    shl eax,1      # 将eax值左移1位,相当于乘以 2
    shr ebx,cl     # 将ebx值右移 n 位(n为 cl 中的值)

8)neg 指令:取负指令。

语法如下:
    neg <reg>		neg <mem>
举例:
    neg eax    # eax <--- -eax
(3)控制流指令

x86 处理器维持着一个指示当前执行指令的指令指针(IP),当一条指令执行后,此指针自动指向下一条指令。IP 寄存器不能直接操作,但可以用控制流指令更新。通常用标签指示程序中的指令地址,在 x86 汇编代码中,可在任何指令前加入标签。例如,

		mov esi,[ebp+8]
begin:  xor ecx,ecx		# 指示第二条指令,控制流指令通过标签就可以实现跳转
    	mov eax,[esi]

1)jmp 指令: 控制 IP 转移到 label 所指示的地址(从 label 中取出指令执行)

语法如下:
	jmp <label>
举例:
    jmp begin    # 转跳到 begin 标记的指令执行

2)jcondition 指令:条件转移指令,依据 CPU 状态字中的一系列条件状态转移。CPU状态字中包括指示最后一个算术运算结果是否为 0,运算结果是否为负数等。

语法如下:
    je   <label> 	(jump when equal)
	jne  <label>	(jump when not equal)
	jz	 <label>	(jump when 1ast result was zero)
	jg	 <label>	(jump when greater than)
	jge	 <label>	(jump when greater than or equal to)
	jl	 <label>	(jump when less than)
	jle	 <label>	(jump when less than or equal to)
举例:
    cmp eax,ebx
    jlc done  # 如果 eax 的值小于等于ebx值,跳转到done指示的指令执行,否则执行下一条指令。

3)cmp/test 指令:cmp 指令用于比较两个操作数的值,test 指令对两个操作数进行逐位与运算,这两类指令都不保存操作结果,仅根据运算结果设置 CPU 状态字中的条件码。

语法如下:
    cmp <reg>,<reg> / test <reg>,<reg>
	cmp <reg>,<mem> / test <reg>,<mem>
	cmp <mem>,<reg> / test <mem>,<reg>
	cmp <reg>,<con> / test <reg>,<con>
举例:
    cmp dword ptr [var],10    #将 var 指示的主存地址的4字节内容,与 10 比较
	jne loop		# 如果相等则继续顺序执行; 否则跳转到 loop 处执行
	test eax,eax    # 测试 eax 是否为零
	jz xxxx         # 为零则置标志 ZF 为 1,转跳到 xxxx 处执行

4)call/ret 指令:分别用于实现子程序(过程、函数等)的调用及返回。

语法如下:
	call <label>
	ret

call 指令首先将当前执行指令地址入栈,然后无条件转移到由标签指示的指令。 当 call 指令结束后,返回调用之前的地址。ret 指令实现子程序的返回机制,ret 指令弹出栈中保存的指令地址,然后无条件转移到保存的指令地址执行。

4.3.2、选择语句的机器级表示
(1)条件码(标志位)
CF进(借)位标志最近无符号整数加(减)运算后的进(借)位情况,有进(借)位 CF=1
ZF零标志最近操作的运算结果是否为0。若结果为0,ZF=1
SF符号标志最近的带符号数运算结果的符号。若为负,SF=1
OF溢出标志最近的带符号数运算结果是否溢出。若溢出,OF=1

常见的算术逻辑运算指令(add、sub、imul、or、and、shl、inc、dec、not、sal 等)会设置条件码。但有两类指令只设置条件码而不改变任何其他寄存器:cmp 指令和 sub 指令的行为一样,test指令与 and 指令的行为一样,但是它们只设置条件码,而不更新目的寄存器。

(2)if 语句

if-else 语句的通用形式如下:

if(test_expr) // test_expr 是一个整数表达式,它的取值为 0 (假)
	then_statement
e1se
	else_statement

翻译成汇编语言:

	t = test_expr;
	if(!t)
		goto false;
	then_statement
	goto done;
false:
	else_statement
done:
4.3.3、参考博客

(1)程序的机器级表示

(2)选择结构语句的机器级表示

(3)选择和循环语句的机器级表示

4.3.4、对应习题

01、假设 R[ax] = FFE8H,R[bx] = 7FE6H,执行指令"addw %bx,%ax"后,寄存器的内容和各标志的变化为【R[ax] = 7FCEH,OF=0,SF=0,CF=1,ZF=0】。

解析:由指令格式可知该指令是 AT&T 格式,add 指令的目的寄存器为 ax。add 指令的补码加法过程为 1111 1111 1110 1000+0111 1111 1110 0110 =(1)0111 1111 1100 1110 (7FCEH),参与加法运算的两个数的符号不同,因此必定不会溢出,OF=0;结果的符号位为0,SF=0;有进位,CF=1 ⨁ \bigoplus 0 = 1;非 0,ZF=0。


4.4、CISC 和 RISC 的基本概念

1)CISC 的主要特点
指令系统复杂庞大,指令数目一般为 200 条以上。
指令的长度不固定,指令格式多,寻址方式多。
可以访存的指令不受限制。
各种指令使用频度相差很大。
各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制。
难以用优化编译生成高效的目标代码程序。
2)RISC的主要特点
选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。
指令长度固定,指令格式种类少,寻址方式种类少。
只有 Load/Store(取数/存数)指令访存,其余指令的操作都在寄存器之间进行。
CPU 中通用寄存器的数量相当多。
RISC 一定采用指令流水线技术,大部分指令在一个时钟周期内完成。
以硬布线控制为主,不用或少用微程序控制。
特别重视编译优化工作,以减少程序执行时间。

RISC 是尽量简化单条指令的功能,复杂指令的功能由简单指令的组合来实现,而增强指令的功能则是 CISC 的特点。

对比项目CISCRISC
指令系统复杂、庞大简单、精简
指令数目一般大于200条一般小于100条
指令字长不固定固定
可访存指令不加限制只有Load/Store指令
各种指令执行时间相差较大绝大多数在一个周期内完成
各种指令执行频度相差很大都比较常用
通用寄存器数量较少
目标代码难以用优化编译生成高效的目标代码程序采用优化的编译程序,生成代码较为高效
控制方式绝大多数为微程序控制绝大多数为组合逻辑控制
指令流水线可以通过一定方式实现必须实现

4.5、简答题

01、什么是指令?什么是指令系统?为什么要引入指令系统?

指令就是要计算机执行某种操作的命令。一台计算机中所有机器指令的集合,称为这台计算机的指令系统。引入指令系统后,避免了用户与二进制代码直接接触,使得用户编写程序更为方便。另外,指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。

02、一般来说,指令分为哪些部分?每部分有什么用处?

一条指令通常包括操作码字段和地址码字段两部分。其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,它是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。地址码用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用子程序的入口地址等。

03、对于一个指令系统来说,寻址方式多和少有什么影响?

寻址方式的多样化能让用户编程更为方便,但多重寻址方式会造成 CPU 结构的复杂化,也不利于指令流水线的运行。而寻址方式太少虽然能够提高 CPU 的效率,但对于用户而言,少数几种寻址方式会使编程变得复杂,很难满足用户的需求。

04、简述各常见指令寻址方式的特点和适用情况。

立即寻址:操作数获取便捷,通常用于给寄存器赋初值。
直接寻址相对于立即寻址,缩短了指令长度。
间接寻址扩大了寻址范围,便于编制程序,易于完成子程序返回,
寄存器寻址的指令字较短,指令执行速度较快。
寄存器间接寻址扩大了寻址范围。
基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间。
变址寻址主要用于处理数组问题,适合编制循环程序。
相对寻址用于控制程序的执行顺序、转移等。
基址寻址和变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但是在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的;而在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的。

05、一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址?

现代计算机都采用字节编址方式,即一个内存单元只能存放一字节的信息。一个操作数(如char、int、floal、double)可能是 8位、16位、32位或 64位等,因此可能占用1个、2个、4个或 8个内存单元。也就是说,一个操作数可能有多个内存地址对应。
有两种不同的地址指定方式:大端方式和小端方式。
大端方式:指令中给出的地址是操作数最高有效字节(MSB)所在的地址。
小端方式:指令中给出的地址是操作数最低有效字节(LSB)所在的地址。

06、采用什么寻址方式时指令码长度最短?采用什么寻址方式时指令码长度最长?

由于通用寄存器的数量有限,可以用较少的二进制位来编码,所以采用寄存器寻址方式和寄存器间接寻址方式的指令码长度最短。因为需要在指令中表示数据和地址,所以立即寻址方式、直接寻址方式和间接寻址方式的指令码长度最长。

07、采用什么寻址方式时执行速度最快?采用什么寻址方式时执行速度最慢?

由于通用寄存器位于 CPU 内部,无须到内存读取操作数,所以寄存器寻址方式执行速度最快。而间接寻址方式需要读内存两次,第一次由操作数的间接地址读到操作数的地址,第二次再由操作数的地址读到操作数,所以间接寻址方式的执行速度最慢。

08、若指令系统采用定长指令码格式,则采用什么寻址方式时执行速度最快?

若指令系统采用定长指令码格式,所有指令(包括采用立即寻址方式的指令)所包含的二进制位数均相同,则立即寻址方式执行速度最快,因为读到指令的同时,便立即取得操作数。若采用变长指令码格式,由于要表示一定范围内的立即数,包含立即数的指令通常需要较多的二进制位,取指令时,可能需要不止一次地读内存来完成取指令。因此,采用变长指令码格式时,寄存器寻址方式执行速度最快。


  • 10
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星航夜空的帆舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值