计算机组成原理

123

错题

缺漏:

第一章:

第三章:类型转换表示方法,乘除法 浮点数计算,CF,SF,OF意义和作用(作业T7)

第四章:RR、RS之类

第五章:选择t8指令执行、MIPS指令单周期多周期分析图8、16、19、微程序

第一章

  • 从计算机的主要元器件来看,计算机发展所经历的过程为B
    A.晶体管、电子管、SSI、MSI、LSI、ULSI、VLSI
    B.电子管、晶体管、SSI、MSI、LSI、VLSI、ULSI
    C.电子管、晶体管、LSI、MSI、SSI、VLSI、ULSI
    D.晶体管、电子管、MSI、SSI、LSI、ULSI、VLSI

    第一代:电子管;第二代,晶体管;第三代中、小规模集成电路(MSI、SSI);第四代,大规模和超大规模集成电路(LSI和VLSI),超超大规模(ULSI)

  • 软件分为:系统软件和应用软件

  • 以下给出的软件中,属于应用软件的是D。
    A.汇编程序
    B.编译程序
    C.操作系统
    D.文字处理程序

  • 下面有关指令集体系结构的说法中,错误的是(C)。
    A.指令集体系结构位于计算机软件和硬件的交界面上
    B.指令集体系结构是指低级语言程序员所看到的概念结构和功能特性
    C.程序员可见寄存器的长度、功能与编号不属于指令集体系结构的内容
    D.指令集体系结构的英文缩写是ISA

  • 冯·诺依曼计算机中,CPU区分从存储器取出的是指令还是数据的依据是D
    A.指令译码结果的不同
    B.指令和数据的寻址方式的不同
    C.指令和数据的访问阶段的不同
    D.指令和数据所在的存储单元的不同

  • 以下是有关计算机中指令和数据存放位置的叙述,其中正确的是D
    A.指令存放在内存,数据存放在外存
    B.指令和数据任何时候都存放在内存
    C.指令和数据任何时候都存放在外存
    D.程序被启动后,其指令和数据装入内存

  • 以下有关计算机各部件功能的叙述中,错误的是(A)。
    A.运算器用来完成算术运算 × 运算器的主要功能是实现算术运算和逻辑运算
    B.存储器用来存放指令和数据
    C.控制器通过执行指令来控制整个机器的运行
    D.输入输出设备用来完成用户和计算机之间的信息交换

冯诺依曼

  • 基本工作方式:控制流驱动方式;

  • 最根本的特征:采用“存储程序”原理,即按地址访问并顺序执行指令;

  • 指令和数据均以二进制形式存放在存储器中;

  • CPU区分依据是:指令周期的不同阶段。

  • 冯·诺依曼计算机:以运算器为中心

  • 现代的计算器:以存储器为中心

  • 5大部件:存储器、运算器、控制器、输入设备、输出设备(适配器)

  • 三大部分:CPU(运算器、控制器)、I/O设备(输入设备、输出设备)、主存储器

时钟频率问题

  • 己知计算机A的时钟频率为800MHz,假定某程序在计算机A上运行需要12s。现在硬件设计人员想设计计算机B,希望该程序在B上的运行时间能缩短为8s,使用新技术后可使B的时钟频率大幅度提高,但在B上运行该程序所需的时钟周期数为在A上的1.5倍。那么,机器B的时钟频率至少应为多少才能达到所希望的要求? 1.8GHZ

    首先需要知道:周期=1/频率,时钟周期×时钟周期数(CPI)=总时间。

    本题,用T表示周期,f表示频率,N表示周期数,由A的信息可得:

    Ta*Na=Na/fa=12s,得Na=12s*fa=12*800

    则,B机,Nb/fb=8s,又有Nb=1.5Na,代入Na,得fb=1800,即1.8GHZ

  • 假设同一套指令集用不同的方法设计了两种计算机A和B。机器A的时钟周期为1.2ns,机器B的时钟周期为2ns。某个程序在机器A上运行时的CPI为2,在B上的CPI为1。则对于该程序来说,机器A和机器B之间的速度关系为(D)。
    A.机器A比机器B快1.2倍
    B.机器B比机器A快1.2倍
    C.机器A的速度是机器B的1.2倍
    D.机器B的速度是机器A的1.2倍

    和上题同理。时间=T*CPI,A是2.4,B是2,所以B比A快1.2倍

image-20231105153026386

主频为2.4GHZ,表示电脑一秒钟可以完成(经历)2.4×109个时钟周期

MIPS计算

image-20231101203012899

MIPS:每秒执行百万条指令数(意思就是每秒cpu能算多几个百万的指令)

MIPS=指令数/(执行时间*1*106)=主频/(CPI×1×106)

关键即找执行时间或者找到CPI

注意CPI,是平均执行时间周期数哦!

CPI=一段程序中所有指令的时钟周期数之和/指令条数 (统计角度)
=程序中各类指令的CPI×程序中该类指令的比例 (加权角度)

image-20231101210442600

首先,MIP=指令数/执行时间*106=主频/CPI106,我们首先不知道执行时间,那就先找CPI

CPI=一段程序中所有指令的时钟周期数之和/指令条数 (统计角度)
=程序中各类指令的CPI×程序中该类指令的比例 (加权角度)

主频=1/时钟周期=1/2ns=5*10^8

这里,我们用加权角度。

对于序列1,总指令数为(5+1+1)*109=9*109,因此,CPI=1×5/7+2*1/7+3*1/7=10/7

MIPS=5*10^8/10/7106得250,序列二为300

对于运行速度,=时钟周期*CPI

序列一为2*(5+1x2+1x3)=20s,序列二为2*(10+1x2+1x3)=30s

故选B

异或门就是进制

同余

  • 假定有两个数a和b,若用某一个整数m去除,所得的余数相同,就称a,b两个数对m同余,记作:

a≡b (mod m) 模为m

  • 假设X,Y,Z三个数,满足下列关系:Z=nX+Y (n为整数),则称Z和Y对模X是同余的,记作:

Z≡Y (mod X) Y≡Z (mod X)

  • 例子:以12为模 9 ≡ 12+9 ≡ 24+9 ≡ 36+9

9 ≡ 21 ≡ 33 ≡ 45 ≡ -3 ≡ 12-3 ≡ 9

7+(-3)

​ =7+(12-3)

​ =7+9

​ =16 再对12取余

​ =4

表示负数的时候如利用模的性质转换成正数,即可将原码运算中的减法变成加法运算

第二章

负数转补码:写出原码,符号位为1,从右到左找第一个1,除了符号位都取反

  • short si=-8196;
    unsigned short usi=si;
    

    usi的值。直接补码赋值就好

    -8196原码 1010 0000 0000 0100

    补码 1101 1111 1111 1100

    直接换成十六进制计算真值,DFFC,无符号对应的就是二进制的真值,也就是57340

  • 在( )表示中,数值0是唯一表示的 A.原码 B.反码 C.补码 D.原码或反码

    以8位为例,
    原码0可以是:00000000或者10000000
    反码0可以是:00000000或者11111111
    只有补码的0是唯一表示的:00000000

  • 用于表示浮点数阶码的编码通常是(移码)。

  • 在一般的计算机系统中,西文字符编码普遍采用(B)。
    A.BCD码
    B.ASCII码
    C.格雷码
    D.CRC码

  • 16位补码整数所能表示的范围是(A)。
    A.-2^15+(2^15-1)
    B.-(2^15-1)+(2^15-1)
    C.-2^16
    +(2^16-1)
    D.-(2^16-1)~+(2^16-1)

    原码的反码都有符号位,8位的范围都是-127-127;

    而补码只有一个0,0000 0000,因此1000 0000可以用来表示-128,所以补码范围-128-128

  • 设**[X]补**=1.X1X2X3X4,当X1X2X3X4满足什么条件时,X>一1/2成立?
    【分析解答】
    补码的编码规则是:“正数的补码,其符号位为0,数值位不变;负数的补码,其符号位为1,数值位各位取反,末位加1。”从形式上来看,[X]补的符号位为1,故X一定是负数。因此,绝对值越大,数值越小,因而要满足X>一1/2,则X的绝对值必须小于1/2。因此,X1必须为0,X2X3X4任意

  • [X]补=1000 0000,因为补码只有一个0即0000 0000,所以,这个1000 0000就是-128,不要觉得是没有符号位的!

  • U表示该常数用无符号整型方式存储,相当于 unsigned int

    L表示该常数用长整型方式存储,相当于 long

    F表示该常数用浮点方式存储,相当于 float三、自动类型转换

千万注意正整数的原反补都是一致的!!!

  • 作业2.6,t8

    image-20231108200139163

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的
余数。任何有模的计量器,均可化减法为加法运算。

例如:
时钟的计量范围是0~11,模=12。

BCD码

每一位十进制数都用二进制表示(4位二进制)

(10 1001)bcd =(29)十进制

四种机器码表示零

原码:小数:x=+0.0000 [x]原=0.0000
x=-0.0000 [x]原=1.0000
整数:x=+0 [x]原=0,0000
X=-0 [x]原=1,0000

反码:x=+0 [x]反=0,0000
X=-0 [x]反=1,1111
x=+0.0000 [x]反=0.0000
x=-0.0000 [x]反=1.1111

补码:x=+0 [x]补=0,0000
X=-0 [x]补=0,0000
x=+0.0000 [x]补=0.0000
x=-0.0000 [x]补=0.0000

移码:x=+0 [x]移=1,0000
X=-0 [x]移=1,0000
x=+0.0000 [x]移=1.0000
x=-0.0000 [x]移=1.0000

补码和移码的零唯一,但是不同!

小数转二进制

image-20231107213549340

④:故加上符号为最后结果为:1101.0011(第一个1是符号位表示负数)

浮点数

image-20231107222410362

1.化为二进制
2.最高符号位
3.取8位阶段码,通过偏置位127得真值
4。写出隐藏1,加上尾数得到真值

规格化

  • 浮点数尾数用原码表示:有效位最高位必须为1
  • 浮点数尾数用补码表示:

image-20231108164220032

IEEE754

image-20231108202859956

image-20231108202917490

第三章

减一个数等于加他的补码

无符号,空位补0;有符号,空位补符号位

image-20240104004236231

  • 8位补码定点整数10010101左移一位后的值为(D)。
    A.10101010
    B.00101010
    C.00101011
    D.溢出

    移出的符号位与最高位不同,发生溢出

    *左移还是右移都先转换成补码形式*

    *左移:高位丢弃,低位补零*

    右移:低位丢弃,高位不变****

  • 2.整数和小数 扩展位数的规则:

    (1)正数/原码负数:有符号或无符号数的原码,反码,补码,一律整数在高位补0来补充少的位数,小数在低位补0来补充少的位数;

    (2)原码负数:整数高位补0,小数低位补0;

    (3)反码负数:整数高位补1,小数低位补1;

    (4)补码负数:整数高位补1,小数低位补0;(非常重要,在硬件编程中经常用到!!!)

  • ALU是由组合逻辑电路构成的,最基本的部件是并行加法器。由于单纯的ALU不能够存储运算结果和中间变量,往往将ALU和寄存器或暂存器相连;ALU既能进行算术运算又能进行逻辑运算。

注意加法器放入的要取决于sub,都是补码形式(正数都一样)

  • x正,y正,x+y,都是二进制,sub为0
  • x正,y正,x-y,y放反码,sub为1,相当于把y+1成为补码
  • x负、y负,x+y,都放补码,sub为0
  • x负,y负,x-y,x放补码,y放-y的二进制-1,sub为1,相当于输入的y+1就是y正

image-20240104011252218

标志寄存器

CF——进/错位标志,OF——溢出标志,SF——符号标志,ZF——零标志

溢出标志OF采用两个规则判断结果

  • 若两个加数的符号位相同,但与结果的符号位相异,则溢出
  • 若最高位上的进位和此高位上的进位不同,则溢出

SF,1表示整数;ZF,0表示不为0

C语言类型转换

32位编译器

char :1个字节

char*(即指针变量): 4个字节

short int : 2个字节

int: 4个字节

unsigned int : 4个字节

float: 4个字节

double: 8个字节

long: 4个字节

long long: 8个字节

unsigned long: 4个字节

64位编译器

char :1个字节

char*(即指针变量): 8个字节

short int : 2个字节

int: 4个字节

unsigned int : 4个字节

float: 4个字节

double: 8个字节

long: 8个字节 (定义是long至少不小于int)

long long: 8个字节 (long long至少不小于long)

unsigned long: 8个字节

第四章

4.6 5,10-3,11,16,19

5.下列有关标志寄存器的叙述中,错误的是(B)。
A.可用它来存放执行指令得到的各种标志信息
B.可通过指令直接访问标志寄存器并修改其值
C.条件转移指令根据其中的标志位确定PC的值
D.不需像通用寄存器那样对标志寄存器进行编号

5.标志寄存器用来存放执行指令得到的各种标志等信息,因此,标志寄存器中的内容
通常是在执行指令过程中由CPU根据指令执行结果自动生成的,用户不能通过指令直接
指定标志寄存器编号来修改其内容。标志寄存器一般是专用寄存器,而不是通用寄存器,因此,它也没有编号,不能在指令中直接指定其编号来访问它,也即不是用户可见寄存器。标志寄存器中的标志位主要用于条件转移或条件设置类指令中的条件判断。

7.假定指令地址码给出的是操作数的存储地址,则该操作数采用的是(B)寻址
方式。
A.立即
B.直接
C.基址
D.相对

如果给出的是操作数则是立即寻址

9.假定指令地址码给出的是操作数所在的寄存器的编号,则该操作数采用的是(C)
寻址方式。
A.直接
B.间接
C.寄存器直接
D.寄存器间接

10.寄存器间接寻址方式的操作数存放在(B)中。
A.通用寄存器
B.存储单元
C.程序计数器
D.堆栈

12.若变址寄存器编号为X,形式地址为D,则变址寻址方式的有效地址为(
A.R[X]+D
B.R[X]+R[D]
C.M[R[X]+D]
D.M[R[X]+M[D]]

12.变址寻址方式下,有效地址为形式地址加上变址值,变址值存放在变址寄存器中,
因此,变址寻址方式的有效地址为R[X]十D。答案为选项A。

  • CISC(Complex Instruction Set Computer)

    • 复杂指令集计算机。早期的计算机为了增加功能和更好地支持高级语言而不断地增加新的指令类型,使CPU可以直接实现复杂的指令操作。
    • 这种指令系统中的指令功能复杂寻址方式多指令长度可变,指令格式多样。
    • 因而采用这种指令系统的计算机被称为复杂指令集计算机。
  • RISC(Reduced Instruction Set Computer)

    • 精简指令集计算机。
    • 这种计算机采用简化的指令系统,指令集中只包含程序中常用的指令,只有Load和Store指令才能访存
    • 运算类指令只能是R-R型
    • 提供大****量通用寄存器以减少访存次数
    • 采用流水线方式执行指令
    • 控制器用硬连阵列逻辑实现,并采用优化的编译技术。

21.通常将在部件之间进行数据传送的指令称为传送指令。以下有关各类传送指令功能的叙述中,错误的是(D)。
A.出/入栈指令(push/pop)完成CPU和栈顶之间的数据传送
B.访存指令(load/store)完成CPU和存储单元之间的数据传送
C.I/O指令(in/out)完成CPU和I/O端口之间的数据传送
D.寄存器传送指令(move)完成CPU和寄存器之间的数据传送 寄存器和存储单元

13.假定采用相对寻址方式的转移指令占两个字节,第一字节是操作码,第二字节是相对位移量(用补码表示)。取指令时,每次CPU从存储器取出一个字节,并自动完成PC+1→PC。假设执行到某转移指令时(取指令前)PC的内容为200CH,该指令的转移目标地址为1FB0H,则该转移指令第二字节的内容应为(DC
A.5CH
B.5EH
C.A2H
D.A4H

取出操作数和偏移量就要+2了,要剪掉2

3某计算机为定长指令字结构,采用扩展操作码编码方式,指令长度为16位,每个地
址码占4位三地址指令15条,二地址指令8条,一地址指令127条,则剩下的零地址指令
最多有(B)条。
A.15
B.16
C.31
D.32

3.指令长度为16位,每个地址码占4位,对于三地址指令,地址码占12位,操作码占
4位,最多16种编码,15条指令用掉15种编码00001110,还剩一种编码1111;对于二地
址指令,高4位操作码一定是1111,低位的地址码占8位,剩下的中间操作码还有4位,最
多可以有16种编码,8条指令用掉8种编码11110000
11110111;对于一地址指令,高5位操作码一定为11111,低4位为地址码,剩下的中间操作码还有7位,最多可以有128种
编码,127条指令用掉127种编码111110000000~111111111110,还剩一种编码11111
1111111未用:对于零地址指令,其高12位操作码一定为111111111111,因此,还有4位未编码,故剩下的零地址指令最多有16条。答案为选项B。

栈顶的地址存放在一个特定的栈指针寄存器中,可以使用专门的入栈和出栈指令来访问栈顶数据,也可以通过普通的访存指令来读写栈帧中某个位置的内容

分析应用

1

寻址

寻址 偏移量 基准地址
相对寻址 指令的形式地址给出 程序计数器PC给出
变址寻址 变址寄存器给出 指令的形式地址
基址寻址 指令的形式地址 基址寄存器

可以看到,相对寻址和变/基址寻址的区别就是对象是程序计数器还是通用寄存器(变址寄存器/基址寄存器),也就是找当前指令前D个单元处的信息

而变址指令形式地址给出的是基准地址,偏移量有变址寄存器给出
基址由基址寄存器给出基准地址,偏移量由指令形式地址给出。

  • 在R型指令中:

    • OP:操作码
    • rs:第一个源操作数寄存器
    • rt:第二个源操作数寄存器(单目源数据)
    • rd:结果寄存器
    • Ms: 源操作数的寻址方式(mode)
    • Md: 目的操作数的寻址方式(mode)
    • shamt:移位操作时的位移量,非移位操作时为0
    • func:功能码
    • 例:R[rd] ← R[rs] + R[rt]
  • 在I型指令(立即数型指令)中:

    • rs:源操作数寄存器
    • rt:结果寄存器
    • 例:R[rt] ← R[rs]

字长是指CPU指令集中的单指令的最大处理长度->通用寄存器位数

16.假设某条指令的一个操作数采用一次间接寻址方式)指令中给出的地址码为
1200H,地址1200H中的内容为12FCH,地址12FCH中的内容为38B8H,地址38B8H中
的内容为88F9H,则该操作数的有效地址为(B)
A.1200H
B.12FCH
C.38B8H
D.88F9H

16.一次间接寻址方式下,指令中给出的地址码为操作数的有效地址的地址,所以,操作数的有效地址是指令中地址码所指出的存储单元中的内容,即12FCH。答案为选项B。

17.假设某条指令的一个操作数采用寄存器间接寻址方式,假定指令中给出的寄存器编号为8,8号寄存器的内容为1200H,地址1200H中的内容为12FCH,地址12FCH中的内容为38B8H,地址38B8H中的内容为88F9H,则该操作数的有效地址为(A)。
A.1200H
B.12FCH
C.38B8H
D.88F9H

17.寄存器间接寻址方式下,操作数的有效地址在指令中给出的寄存器中,因此,8号寄存器中的内容为操作数的有效地址,即1200H。答案为选项A。

14.假设某指令的一个操作数采用变址寻址方式,变址寄存器中的值为124,指令中给
出的形式地址为B000H,地址B000H中的内容为C000H,则该操作数的有效地址为
D错 C对
A.B124H
B.C124H
C.B07CH
D.C07CH

14.变址寻址方式下,有效地址为变址寄存器中的值加上形式地址,变址值124=111
1100B=7CH,有效地址为B000H+007CH=B07CH。答案为选项C。

目标地址范围

大小端存储

MSB,most,最高有效位

LSB,least,最低有效位

大端:高位存低地址,低位存高地址

小端:低位存低地址,高位存高地址

数据存储:小端模式和大端模式——终于搞明白了!!!_小端存放_风兔子喵的博客-CSDN博客

image-20231116234740547

15.假设某计算机采用小端方式存储,按字节编址。一维数组a有100个元素,其类型
float,存放在地址C0001000H开始的连续区域中,则最后一个数组元素的MSB所在的
地址应为(D}。
A.C0001396H
B.C0001399H
C.C000118CH
D.C000118FH

15.数组元素的访问通常使用变址寻址方式,数组起始地址通常是指令中直接给出的
形式地址,下标变量存放在变址寄存器中,本题中,数组元素类型为float,故每个数组元素
4个字节,最后一个元素的下标为99,其首地址为C0001000H+99×4=C0001000H+
110001100B=C000118CH。因为采用小端方式并按字节编址,所以MSB所在的地址应
为C000118FH。答案为选项D。

18.某计算机按字节编址,采用大端方式在储信息。其中,某指令的一个操作数的机器
数为ABCD 00FFH,该操作数采用基址寻址方式,指令中形式地址(用补码表示)为
FF00H,当前基址寄存器的内容为C000O000H,则该操作数的LSB(即FFH)存放的地址是
(D)。
A.C00O FFOOH
B.C000 FFO3II
C.BFFF FFOOH
D.BFFF FFO3H

18.基址寻址方式下,操作数的有效地址为基址寄存器内容加上形式地址,因此,操作
数ABCD 00FFH存放在C0000000H+FFO0H-C0000000+FFFF FF00=BFFF FFO0H
因为是大端方式并按字节编址,所以LSB(FFH)存放的地址为BFFF FF03H。答案为选D

第五章

立即数都是存放在指令中的操作数单元,仅仅跟随着操作码。而对于这个值来说你可以解释为数字,也可以解释为地址,就好比数字4816511,你可以解释为人民币数值,也可是电话号码。

立即数具体是什么含义那得看操作码了

、3.冯·诺依曼计算机中指令和数据均以二进制形式存放在存储器中,CPU依据(C)来区分它们。
A.指令和数据的表示形式不同
B.指令和数据的寻址方式不同
C.指令和数据的访问时点不同
D.指令和数据的地址形式不同

取指令或数据时所处的机器周期不同:取指周期取出的是指令分析、取数或执行周期取出的是数据

对汇编语言程序员不透明的是 ( D ) 。

A指令寄存器(IR)
B存储器地址寄存器(MAR)
C存储器数据寄存器(MDR)
D程序计数器(PC)

5.下列有关CPU中部分部件的功能的描述中,错误的是D)。
A.控制单元用于对指令操作码译码并生成控制信号
B.PC称为程序计数器,用于存放将要执行的指令的地址
C.通过将PC按当前指令长度增量,可实现指令的按序执行
D.IR称为指令寄存器,用来存放当前指令的操作码 (正在执行的一条完整的指令而不是操作码)

8.下列有关程序计数器P℃的叙述中,错误的是(B
A.每条指令执行后,PC的值都会被改变
B.指令顺序执行时,PC的值总是自动加1 X 是加上当前执行指令的长度,1指一条指令的长度
C.调用指令执行后,PC的值一定是被调用过程的入口地址
D.无条件转移指令执行后,PC的值一定是转移目标地址

image-20240102205112791

image-20240102205130374

image-20240102205145727

image-20240102205156332

image-20240102205220128

image-20240102205243020

image-20240102205304741

第六章

超标量(superscalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术

下面两个题要区分,同样是三条,采用转发技术,一个要加nop一个不用加。原因就是lw是load,它应该不适用于ALU直接转发,因为这里的是地址,要从主存中load才能把操作数取来放到Mem阶段的DM,所以应该是在Mem的DM进行转发到第三条的ALU,因此要加一个气泡把第三条的ALU移到load的DM之后。

转发能够解决大部分 RAW 数据冒险,那么 lw 指令随后跟 R型指令或I型运算类指令的相关问题能否通过转发来解决呢?不可以!!!

image-20240103103249420

image-20240103103334332

image-20240103104229216

链接:https://www.nowcoder.com/questionTerminal/4fccb91e532746d095565476efa9732a
来源:牛客网

对于经典五段流水线的数据相关问题,一般需要考察前后指令之间是否有寄存器写后读(顺序执行下,不会发生写后写或读后写的相关冲突,在乱序执行下才有可能发生)的问题。

关于数据相关的流水线问题,具体延迟几个周期与下列两个因素相关:

\1. 是否能在同一周期内完成寄存器的读和写

\2. 是否采用“转发/定向”(forward)技术

具体的讨论如下:

  • ​ 如果两者都为否定,那么应当至少延迟3个时钟周期。(下一条指令必须等到上一条指令完成写回后所需操作数才准备就绪)
  • ​ 如果能够在同一周期内完成寄存器的读和写,则上一条指令的“WB”段(写回)与下一条数据相关指令的“ID”(取操作数)可以安排在同一周期,此时至少延迟2个时钟周期。
  • ​ 如果更进一步,采用了“转发技术”,那么需要根据上一条指令的类型来进行区分:
    • ​ 若上一条指令为算术逻辑运算类指令,例如sub、add等等,结果操作数能够在“EX段获得的话,那么上一条指令在“EX”段(运算)运算的结果,可以直接转发到本条指令运算时的一端,从而时钟周期延迟为0。
    • ​ 若上一条指令为取数指令(ld),结果操作数必须等到访存阶段结束才能获得,那么至少需要延迟1个时钟周期。

第七章

按字节编址:存储器被划分成若干个单元每个单元容量为1个字节,从0开始编号(地址)。

5.某计算机字长16位,主存地址空间大小是64KB,按字节编址,则寻址范围是A
A.0(64K-1) B.0(32K-1)
C.0(64KB-1) D.0(32KB-1)

注意 存储空间64B,这里按字节编址,所以应该是那么寻址范围就是64KB/1B=64K(个单元),而一般从0开始,就是0-(64K-1)
如果是按字长的话,1字=16bit=2B,那么64KB/2B=32K,寻址范围就应该是0-(32K-1)

6.EPROM是指()。
A.读写存储器 B.掩膜只读存储器
C.可编程的只读存储器 D.可擦除可编程的只读存储器

几个英文缩写:

  • ROM Read Only Memory只读存储器;RAM Random Access Memory随机访问存储器
  • DRAM,动态随机访问存储器,由电容组成,破坏性读出,要刷新
  • SRAM,静态随机访问存储器,双稳态的正负反馈电路,非破坏性,元器件多->集成度小,适合做高速缓冲存储器(cache)
  • PROM 可编程只读存储器
  • EPROM,Erasable PROM,可擦除可编程只读存储器
  • EEPROM,Electrically EPROM,电可擦除可编程只读存储器
  • Flash Memory,闪存,非易失,某种低电压是可读不可写;某种高电压可更改或删除

7.下列几种存储器中,(A)是易失性存储器。
A.cache B.EPROM
C.Flash Memory D.CD-ROM

9.需要定时刷新的半导体存储器芯片是(B)。
A.SRAM B.DRAM(电容,破坏性)
C.EPROM D.Flash Memory

10.通常采用行、列地址引脚复用的半导体存储器芯片是()。
A.SRAM B.DRAM
C.EPROM D.Flash Memory

11.具有RAS(行地址选通)和CAS(列地址选通)信号引脚的半导体存储器芯片是(B)。
A.SRAM B.DRAM
C.EPROM D.Flash Memory

image-20240104205726506

12.下面有关ROM和RAM的叙述中,错误的是()
A.RAM是可读可写存储器,ROM是只读存储器√
B.ROM和RAM都采用随机访问方式进行读写√
C.系统的主存由RAM和ROM组成√
D.系统的主存都用DRAM芯片实现× RAM区一般用DRAM,ROM区用相应的ROM存储元件

13.下面有关半导体存储器的叙述中,错误的是(A)。
A.半导体存储器都采用随机存取方式进行读写 不一定 全相联就是根据内容即cache行号进行读写
B.ROM芯片属于半导体随机存储器芯片
C.SRAM是半导体静态随机访问存储器,可用作cache
D.DRAM是半导体动态随机访问存储器,可用作主存

计算题

14.假定DDR3 SDRAM芯片内部核心频率为133.25MHz,与之相连的存储器总线每次传输8B,则下面有关叙述中,错误的是(C)。
A.芯片内部I/O缓冲采用8位预取技术
B.存储器总线每秒传1066M次数据
C.存储器总线的时钟频率为1066MHz
D.存储器总线的带宽大约为8.5GB/s

DDR3 SDRAM就是8位预取
一秒133.25次,每次8B,则每秒传133.25×8B≈1066M
时钟频率:前置知识——存储器每个时钟频率传两次数据,因此每秒传1066M次,是两次的,时钟频率应为1066M次/2=533MHZ
带宽:1066M×8B≈8.5GB/s。 带宽为一个信号在频带上的宽度

芯片内编址最小地址

15.假定用若干个16K×1位的存储器芯片组成一个64K×8位的存储器,芯片内各单元连续编址,则地址BFF0H所在的芯片的最小地址为()。
A.4000H B.6000H
C.8000H D.A000H

16.假定用若干个16K×8位的存储器芯片组成一个64K×8位的存储器,芯片内各单元交叉编址,则地址BFFFH所在的芯片的最小地址为()。
A.0000H B.0001H
C.0002H D.0003H

连续编址在单元内编(竖着),交叉是各单元跳着(横着),因此有

  • 连续编址:模块位|块内地址,模块在高位
  • 交叉编址:块内地址|模块位,模块位在低位

求出总地址位和其中一个位,得到地址范围

15题存储器64K=2^16,则地址位有16位(表示所有地址),有4块芯片,则模块位占2位块内地址14位,于是列出所有模块的地址范围

1: 0000…0000-0011…1111 后14位,十六进制就是0000H-3FFFH

2: 0100…0000-0111…1111,十六进制就是4000H-7FFFH

3: 同理十六进制就是8000H-BFFFH

4: 十六进制就是C000H-FFFFH

则BFF0H应该在8000H-BFFFH,即第三块

16题交叉编址,地址位数16位,四个芯片,模块为为低2位

BFFFH,低两位都为1,则是第四个模块,最小地址位0003H

33.以下是有关虚拟存储管理机制中地址转换的叙述,其中错误的是(B)。
A.地址转换是指把逻辑地址转换为物理地址
B.通常逻辑地址的位数比物理地址的位数少
C.地址转换过程中会发现是否“缺页”
D.MMU在地址转换过程中要访问页表项

35以下是有关虚拟存储管理机制中页表的叙述,其中错误的是D
A.系统中每个进程有一个页表
B.页表中每个表项与一个虚页对应
C.每个页表项中都包含装入位(有效位)
D.所有进程都可以访问页表

37.以下是有关页式存储管理的叙述,其中错误的是(D)。
A.进程被划分成等长的页,内存被划分成同样大小的页框
B.采用全相联映射,每个页可以映射到任何一个空闲的页框中
C.当从磁盘装人的信息不足一页时会产生页内碎片
D.相对于段式存储管理,分页式更利于存储保护

38.以下是有关段式存储管理的叙述,其中错误的是(D)。
A.段是逻辑结构上相对独立的程序块,因此段是可变长的
B.按程序中实际的段来分配主存,所以分配后的存储块是可变长的
C.每个段表项必须记录对应段在主存的起始位置和段的长度
D.分段方式对低级语言程序员和编译器来说是透明的

39.以下是有关快表的叙述,其中错误的是()。
A.快表的英文缩写是TLB,称为转换后援缓冲器
B.快表中存放的是当前进程的常用页表项
C.在快表中命中时,在L1 cache中一定命中。不一定在L1
D.快表是一种高速缓存,一定在CPU中

cache总容量

cache块大小=主存块大小

然而cache还要放其他位和标记位

由此看来 Cache 总容量 = 行数×行长 = 行数×(其他位+标记部分位数+数据部分位数),其他为包括:可能存在的脏位位数+有效位位数+替换算法位(比如LRU就是2位)

image-20231222115358139

选择T25-29,分析题T9、T11 看书本,区分好各种映射方式的结构、其他位(直写回写替换位)

image-20240104234714860

理解题意,区分主存地址位数和主存块大小,主存块大小存的是数据,cache块大小等于主存块大小,是因为要存放入的主存块数据

而主存地址位数是来表示主存地址编码的,它不是存在主存块内的!

本题主存地址位数32位,字节编址,那就有32/8=4个单元,一个主存块4个单元,块内地址就是2位,还得有cache行号,一共32K行,那就是15位,那么32-2-15=15位就是标记位,其实就是主存块的编号。

而cache总容量就是其他位+标记位+数据,标记为就是来标识放进来的是哪个主存块的

cache 32K字,块大小1个字,那就有32K行,直写有效位1,总容量(1+15+32)×32K

cache缺失损失时钟周期

30.假定CPU通过存储器总线读取数据的过程为:发送地址和读命令需1个时钟周期,存储器准备一个数据需8个时钟周期,总线上每传送1个数据需1个时钟周期。若主存和cache之间交换的主存块大小为64B,存取宽度和总线宽度都为4B,则cache的一次缺失损失至少为()个时钟周期。
A.64
B.72
C.80
D.160

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

方法:算出一个总线事务,然后再乘。

30题,主存块大小为64B,每个总线事务读取4B,则有64B/4B=16个总线事务,每个总线事务用=发送地址和读命令+准备一个数据+传送1个数据=1+8+1=10个时钟周期,则一共需要160个时钟周期

31题,总线事务8个,则一共80个时钟周期

32.假定采用多模块交叉存储器组织方式,存储器芯片和总线支持突发传送,CPU通过存储器总线读取数据的过程为:发送首地址和读命令需1个时钟周期,存储器准备第一个数据需8个时钟周期(即CAS潜伏期=8),随后每个时钟周期总线上传送1个数据,可连续传送8个数据(即突发长度=8)。若主存和cache之间交换的主存块大小为64B,存取宽度和总线宽度都为8B,则cache的一次缺失损失至少为()个时钟周期。
A.17 B.20
C.33 D.65

一次缺失读取64B,每个突发都能读取8B×8=64B,因此只需要一个总线事务,所用时间1+8+8=17.连续传8个那就是8个时钟周期

在这里插入图片描述

img

TLB和Page,Cache和主存

四种结构
TLB:快表,是一种虚拟地址到物理地址的地址映射结构,当CPU传出一个地址时,首先到达的就是TLB,如果TLB命中,那么隐藏的含义就是,这个虚拟地址可以直接转换为物理地址(因为快表的表项中装的就是他的实页号,而页内地址则在虚拟地址中可以找到,因此拼接起来就是物理地址)。

Page:页表,是一种虚拟地址到物理地址的地址映射结构,当CPU传出一个地址时,如果Page命中,那么隐藏的含义就是,这个虚拟地址可以直接转换为物理地址(因为页表的表项中装的就是他的实页号,而页内地址则在虚拟地址中可以找到,因此拼接起来就是物理地址)。

Cache:高速缓存,是一种储存数据信息的结构,当物理地址传出时,首先到达的就是Cache,如果Cache命中,那么隐藏的含义就是,这个块我可以直接拿走(因为Cache中保存的就是主存的副本)。

主存:主存,是一种储存数据信息的结构,当物理地址传出时,如果Cache未命中,主存命中,那么隐藏的含义就是,这个块我可以从主存中拿走(因为主存中保存的就是我要的信息,不过速度肯定是没有Cache快,有的时候会差好几个数量级)。

联系
可以看到,

TLB和Page在形式上是高度相似的(他们都是地址映射的结构),Cache和主存在形式上是高度相似的(他们都是保存数据信息的结构)。

TLB和Cache在存取速度和优先级上是高度相似的(他们都是优先访问的,因为他们存取速度比较快),Page和主存在存取速度和优先级上是高度相似的(他们都是后访问的,因为他们都在主存中)

我们知道,Cache是主存的高速缓存。实际上,TLB就是页表的高速缓存。

而Cache用来加速数据存取,TLB用来加速地址转换。

对他们的访问均不算访问内存(因为他们的速度比访问主存快好几个数量级)。(这部分的知识对后面的访存部分有很大作用)

6.假定执行最复杂的指令需要完成6个子功能,分别由对应的功能部件A~F来完成,每个功能部件所花的时间分别为80ps、40ps、50ps、70ps、20ps、30ps,流水段寄存器延时为20ps,现把最后两个功能部件E和F合并,以产生一个5段流水线。该5段流水线的时
钟周期至少是(100)ps。 最长的+寄存器延迟

2.2 数值数据表示方法

数的机器码

原反补

补码十因为正负数有符号位(0正1负),加减不能直接算,而补码可以直接运算

正数都一致

负数:

  • 机算:原码–符号位不变,数值位取反->反码–末尾加1–>补码
  • 快速算:补码–从右往左找到第一个1,这个1左边的所有“数值位”(不包括符号)按位取反->原码
补码的加法

从最低为开始,按位相加(符号位参与运算),并往更高位进位,丢弃超出的部分,比如8bit寄存器超出8位去掉。

负数的补码各位不能解读为位权信息!!!转为原码才能解读

补码的减法

减一个数等于加这个数的相反数

那么已知“减数”的补码,如何求其负值的补码表示?

机算方法:B补<—全部位按位取反,末位+1—>-B补

手算方法:从右往左找到第一个1,左边**所有位(包括符号)**全部取反

注意和补码-原码的区别!一个数值位,一个所有位

总结

image-20230919094524121

移码

image-20230919170130942

  • 定点表示 (小数点位置固定的数)

    • 定点整数
    • 定点小数
    • 仅能表示纯小数及纯整数
  • 浮点表示(解决小数点问题)

  • 机器数 (解决符号问题)

image-20230919170553322

image-20230919170603587

image-20230919170831705

无符号整数

unsigned int 无符号int型

机器字长限制了 通用寄存器长度(因此表示的位数有上限)和ALU的输入端(n位运算)

比如8位,真值为0,高位补0,0000 0000

  • 没有符号位,i位位权时2^i-1
  • nbit无符号整数表示范围:0-2^n-1,表示全0到最大全1

数据校验

奇偶校验

image-20230926084436366

右边是改进的,三个bit可以表示8种状态,只取4个,其他是非法状态。

奇偶校验码:在首位加一个校验位

image-20230926084723091

当有偶数个位发生错误就发现不了,因为1和0数目没有变

计算机求奇偶校验码就是把位数进行异或

image-20230926085304860

运算

优先级:与>或

与、或、非

与非、或非、异或、同或(异或取反)

算数逻辑单元

image-20231010084939783

并行进位加法器

串行进位,依赖于前一个的信息

如何更快的产生进位?其实就是把所有的加数和被加数再结合最开始输入的C0就可以直接得出最终的结果

并行进位的并行加法器:各级进位信息同时形成,又称为先行进位、同时进位。

然而无休止的套娃会让电路越来越复杂,因此一般只用4位加法器,由4个FA和一些新的线路、运算逻辑组成

补码加减运算器

加减运算和溢出判断

原码的加减法

被加数和加数,组合有4中

原码的加法运算:

正+正–绝对值做加法,结果为正

负+负–绝对值加法,结果为负

正+负–绝对值大的减绝对值小的,符号同绝对值大的数

负+正–绝对值大的减绝对值小的,符号同绝对值大的数

原码的减法运算:“减数”符号取反,转变为加法

正-正–>正+正

负-正–>负+负

正-正–>正+负

负+正–>负-负

补码的加减法

原码的逻辑在电路实现中太难了

补码取负值:所有位按位取反再末位+1

对于补码,最终都转变为加法,符号位也参与运算

8位补码最高位是符号位,表示范围为-128-127,超出会溢出

溢出判断

下溢-负数区-0-正数区-上溢

  • 只有正数+正数才会上溢—结果是负
  • 只有负数+负数才会下溢—结果是正

方法

一位符号位

image-20231010094609942

“+”或运算

溢出情况:As,Bs=0,Ss=1或As,Bs=1,Ss=0

采用一位符号位,证据数据位进位情况判断溢出

image-20231010095631809

双符号位

扩展符号位,正数符号位为00,负数符号位为11

实际存储1个,运算时会复制一个符号位

符号扩展

为了解决溢出问题

小数为了不影响位权,在末尾拓展

image-20231010100324855

image-20231010100537593

标志位的生成

定点数的移位运算

原码的乘法

乘法运算的实现思想

原码的一位乘法

X存被乘数,MQ存乘数原码的绝对值

ACC存乘积高位

ACC MQ用完后逻辑右移,MQ可以存放乘积地位,MQ右移出去的位舍弃(乘数低位乘完之后本来就舍弃了没用了)

数值:绝对值相乘,用n轮加法,移位实现,看图步骤

符号为:异或运算

image-20231010113633834

补码的一位乘法

和原码一位乘法类似,采用Booth算法

image-20231017092733316

image-20231017090457843

原码 补码
进行n轮加法、移位 进行n轮加法、移位,最后再多来一次加法
每次的加法 可能是+0,+[|x|] 可能是+0,+[x],+[-x]
每次的移位 逻辑右移,符号位也移动,高位补0 补码的算数右移,符号位固定补位,正数补0,负数补1
符号位 符号位不参与运算 符号位参与运算
加法怎么加 根据当前MQ中的最低位来确定加什么:
MQ中最低为=1时,(ACC)+[|x|]
MQ中最低为=0时,(ACC)+0
根据当前MQ中的最低位辅助位来确定加什么(初始为0)
辅助位-MQ中最低位=1时,(ACC)+[x]
辅助位-MQ中最低位=0时,(ACC)+0
辅助位-MQ中最低位=-1时(ACC)+[-x]

MQ中拓展多一位为辅助位,而所说的最低为是辅助位前一位,为了和原码方法对应

由于所有寄存器长度统一,因此ACC和X都会多加一位,可以表示双符号位

乘数单符号位补码(有一位被辅助位占了),被乘数双符号位补码

原码的除法

image-20231017094703807

恢复余数法,逻辑

image-20231017102516997

加减交替法,

image-20231017103734867

如果第一位商是1,说明被除数比除数大,定点小数没法表示1,检测出来停止运算,因为定点小数没法表示这种情况

补码的除法

image-20231017105414064

除法类型 符号位参与运算 加减次数 移位方向 移位次数 上商、加减原则 说明
原码加减交替法 N+1或N+2 N 余数的正负 若最终余数为负,需恢复余数
补码加减交替法 N+1 N 余数和除数是否同号 商末位恒置1

C语言的类型转换

无符号数与有符号数:不改变数据内容,改变解释方式

长整数变短整数:高位截断,保留地位

页式存储

image-20240105002808381

分页逻辑层面,分块物理层面

进程被分页,页大小就是块大小,分页放进主存块中

image-20240105003403913

关键是逻辑页号——主存块号,通过页表,登记

查到主存块号,拼接上页内地址就是物理地址

逻辑页号|页内地址

image-20240105003247013

快表

快表逻辑上的cache,采用SRAM,主存采用DRAM

页表是逻辑上的主存

chache是主存数据的副本——加快物理地址的访问

而快表是页表页表项的副本——加快地址变换的速度

image-20240105003823746

指令系统

  • 操作码——指明了“做什么”
  • 地址码——指明了“对谁动手”

一台计算机的所有指令的集合构成该机的指令系统,也称为指令集

注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令
Eg: X86架构(Inter的)、ARM架构(手机)

一条指令:操作码字段+地址码字段(操作数字段)

  • 无符号数与有符号数转换方式:把补码完全赋值,然后按无符号整数解析
  • 长整数变短整数:高位截断,保留低位
  • 短整数变长整数,进行符号扩展

image-20240104155754297

指令格式:

一个指令

image-20231024104055949

零地址指令

操作符就是一个零地址指令

image-20231024104316071

一地址指令

image-20231024104552021

二、三地址指令

四地址指令

image-20231024104844533

image-20231024105004386

指令-按指令长度分类

  • 指令字长:一条指令的总长度(可能会变)
  • 机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
  • 存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)

指令-按操作码长度分类

  • 定长操作码:指令系统中所有指令的操作码长度都相同
    n位→2n条指令
    控制器的译码电路设计简单,但灵活性较低
  • 可变长操作码:指令系统中各指令的操作码长度可变
    控制器的译码电路设计复杂,但灵活性较高

定长指令字结构+可变长操作码->扩展操作码指令格式

指令-按操作类型分类

  • 数据传送类:CPU、主存之间的数据传输
  • 运算类:算数逻辑操作、移位操作
  • 程序控制类:改变程序执行流
  • 输入输出类:CPU、IO设备之间的数据传送

扩展操作码

为什么要扩展?因为除了表示四地址指令(16为),可能还需要表示一、二、三地址指令,但是又因为固定是16位,所以短的地址指令相比大的要退一格,把上一格用全1来填充,因此上一个码只有15种(去掉全1)。

cpu一次读入16位,根据是否全1判断是三地址指令还是二地址指令

image-20231024161232495

·在设计扩展操作码指令格式时,必须注意以下两点:

1)不允许短码是长码的前缀,即短操作码不能与长操作码的前
面部分的代码相同。

2)各指令的操作码一定不能重复。
通常情况下,对使用频率较高的指令,分配较短的操作码对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。

image-20231024164856526

指令寻址

下一条 欲执行 指令 的 地址

顺序寻址

定长指令字结构

跳跃寻址

image-20231024170857837

执行指令:JMP,CALL会直接修改PC的值,JMP类似goto,CALL调用函数

数据寻址

确定本条指令地址码指明的真实地址

  • 隐含寻址
  • 立即寻址
  • 直接寻址
  • 间接寻址
  • 寄存器寻址
  • 寄存器简介寻址
  • 相对寻址
  • 基址寻址
  • 变址寻址
  • 堆栈寻址

偏移寻址

基址寻址

以程序的原始存放地址作为”起点“

将CPU中基址寄存器的内容加上指令格式中的形式地址A,形成操作数的有效地址。EA=(BR)+A

OS课的”重定位寄存器“就是”基址寄存器“

image-20231031104220297

有的寄存器不设置基址寄存器,指令编号指明哪个明通用寄存器作为基址,放入 ALU 再把偏移量放进去来寻址

因此,指令编号 n 位可以指明通用寄存器 2个,例如通用寄存器有 8 个,那就要 3 bit 编号

便于程序”浮动”,方便实现多道程序并发运行,扩大寻址范围

注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定(程序员不能决定)。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。

变址寻址

EA=(IX)+A,IX=index register

程序员自己决定从哪里作为”起点“

有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和

和基址寻址很像,但有差别

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址)

基址寻址中,BR保持不变作为基地址,A作为偏移量

image-20231107084734358

复合寻址:

image-20231107085123917

相对寻址

EA=(PC)+A

以程序计数器PC所指地址作为”起点“

相对寻址:EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示
优点

  • 操作数的地址不是固定的,它随着PC值的变化而变,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)
  • 这段代码在程序内浮动(for循环在代码中的位置发生移动)时不用更改跳转指令的地址码

相对寻址广泛应用于转移指令

寻址方式 有效地址 访存次数(指令执行期间)
隐含寻址 程序指定 0
立即寻址 A即是操作数 0
直接寻址 EA=A 1
一次间接寻址 EA=(A) 2
寄存器寻址 EA=R1 0
寄存器间接一次寻址 EA=(R1) 1
转移指令 相对寻址 EA=(PC)+A 1
多道程序 基址寻址 EA=(BR)+A 1
循环程序变址寻址 EA=(IX)+A 1

后面三种即偏移寻址

注意:取出当前指令后,PC会指向下一条指令,相对寻址是相对于下一条指令的偏移

CPU

CPU的功能和基本结构

CPU的功能

CPU:运算器+控制器

  • 指令控制:完成指令、分析指令和执行指令的操作,即程序的顺序控制

  • 操作控制:一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。

  • 时间控制:对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号

  • 数据加工。对数据进行算术和逻辑运算

  • 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。

  • 运算器:对数据进行加工

  • 控制器:取指令,分析指令,执行指令——控制各个部件

    • 取指令:自动形成指令地址,发出取指令命令
    • 操作数译码产生操作数的有效地址
    • 执行指令:根据分析指令得到的“操作命令”和“操作数地址”,形成操作信号控制序列,控制运算器、存储器以及I/O设备完成相应的操作
    • 中断处理

运算器的基本结构

算术逻辑单元:主要功能是进行算术/逻辑运算

通用寄存器组:如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。

暂存寄存器:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容。(内部总线用到)

程序状态字寄存器:保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志(SF)、零标志(ZF)、进位标志
(CF)等PSW中的这些位参与并决定微操作的形成。

移位器对运算结果进行移位运算。

计数器:控制乘除运算的操作步数。

image-20231107100039150

image-20231107100309247

专用数据通路

专用数据通路方式:根据指令执行过程中的数据和地址的流动方向安排连接线路。

如果直接用导线连接,相当于多个寄存器同时并且一直向ALU传输数据
解决方法1.使用多路选择器根据控制信号选择一路输出

image-20231107100424547

解决方法2.使用三态门可以控制每一路是否输出.如:R0out为1时R0中的数据输出到A端,ROout;为O时R,中的数据无法输出到B端

image-20231107100533676

性能较高,基本不存在数据冲突现象,但结构复杂,硬件量大,不易实现。

CPU内部单总线

CPU内部单总线方式:将所有寄存器的输入端和输出端都连接到一条公共的通路上。

image-20231107103753426

由ALU和一系列寄存器组成

如:两个操作数分别来自主存和R。,最后结果存回R0,那么从主存中取来的操作数直接放入暂存器,就不会破坏运算前R,的内容。

结构简单,容易实现,但数据传输存在较多冲突的现象,性能较低。

控制器的基本结构

取指令,分析指令,执行指令

image-20231227000511014

由PC得到下一条指令的地址,接着指令寄存器OP操作数输入到指令译码器进行译码提供操作信号,而地址信号输出到CPU内部总线存放到地址寄存器MAR。数据总线获取到的主存数据会存放在数据寄存器MDR

一系列寄存器+控制单元组成

两个结合

image-20231107105047616

CPU内部透明

用户课件:程序员通过汇编语言进行改变

红色是可见的,灰色不可见辅助CPU工作

image-20231107105253535

PC:用条件转移指令来改变

PSW:条件转移指令本身就要读取PSW的数据,也可以通过比较指令影响PSW

ACC:用户执行加法乘法

通用寄存器:汇编读和写

CU控制单元

总结

简化来说CPU就是由ALU+寄存器+CU控制单元+中断系统组成

image-20231227001225813

image-20231107105314400

n个总线说明支持n组部件的数据交换

image-20231107105416712

指令周期

时钟周期 = 节拍脉冲 = 震荡周期 能完成一次微操作

机器周期 = CPU周期 从主存读出一条指令的最短时间 可完成 复杂操作 完成一个小工作

指令周期:从主存取一条指令并执行指令的全部时间

指令周期——若干个机器周期(CPU时间)组成——一个时钟周期又包含若干个时钟周期

graph TD
B(指令周期)-->A(机器周期)
B-->C(机器周期)
A-->D(时钟周期)
A-->E(时钟周期)

注意事项:

  • 每个指令周期内机器周期数可以不等
  • 每个机器周期内的节拍数也可以不等

image-20231121094141477

上图中不同指令的执行周期不可以不等长,乘法需要执行多个加法自然会长。

从上到下各需要1、2、2、3、4个机器周期

image-20231121094320066

最后进入下一个指令的执行阶段

CPU如何知道执行到哪个阶段?——触发器(设置四个触发器判断处于哪个周期)

数据流

取指周期

结合下面的图:PC指明了接下来要执行的指令在主存的存放地址,因此要把地址信息送到MAR(PC)->MAR,然后CU向控制总线发出读信号1->R,MAR的地址信息通过地址总线送给主存,读出数据后内容通过数据总线送入MDR(M(MAR)->MDR),将MDR的内容(指令)送入IR(MDR)->IR,CU发出控制信号形成下一条指令地址((PC)+1->PC)

MAR存储器地址寄存器

MDR存储器数据寄存器

PC程序计数器

IR指令寄存器

M(MAR)→R表示将MAR所指主存中的内容经总线送到MDR。M是memory

1→R主存读信号

1→W主存去操作

image-20231121095949026

间址周期

之前已经经过了取值周期(回顾上面的内容),由于IR的内容是从MDR复制的,因此IR和MDR此时都是指令

再走一遍,取一个有效地址

1.将指令的地址码送入MAR,
记做:AdIR)→MAR,Ad(MDR)→MAR
2.CU发出控制信号,启动主存做操作
记做:1→R
3.将MAR所指主存中的内容经数据总线
送入MDR,记做:M(MAR)→MDR
4.将有效地址送至指令的地址码字段,
记做:(MDR)→Ad(IR)

image-20231121095755152

执行周期

执行周期的任务是根据R中的指令字的操作码和操作数通过ALU操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向。

中断周期

数据要写到主存一定要先放入MDR

先保存现场—去执行中断处理程序–恢复现场

所以要先将断点的存入到MDR放入主存保存,然后执行完再去找原来的

SP要-1是因为有进的进入栈,要-1指回断点位置

保存现场

1.CU控制将SP减1,修改后的地址送入MAR(有些SP是放在CU中)
记做:(SP)-1→SP,(SP)→MAR
本质上是将断点存入某个存储单元,假设其地址为a,故可记做:a→MAR
2.CU发出控制信号,启动主存做操作,
记做:1→W
3.将断点(PC内容)送入MDR,
记做:(PC)→MDR

执行中断程序

4.CU控制将中断服务程序的入口地址
(由向量地址形成部件产生)送入PC,
记做:向量地址→PC

image-20231228121002349

指令执行方案

单指令周期

对所有指令都选用相同的执行时间来完成(最长的那一个)

  • 指令之间串行执行
  • 指令周期取决于执行时间最长的指令的执行时间。
  • 对于那些本来可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低整个系统的 运行速度。

只需要根据节拍数来确定指令是否结束就好,设计更方便

image-20240104193755331

多指令周期

对不同类型的指令选用不同的执行步骤来完成

  • 指令之间串行执行;
  • 可选用不同个数的时钟周期来完成不同指令的执行过程。
    缺点:需要更复杂的硬件设计。

流水线方案

在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。

  • 指令之间并行执行

某个部件执行完不用后,下一个指令直接使用该部件。如计算和I/0,A计算完进入I/O,B直接进行计算,并行执行

image-20231121103949441

指令周期同步

  • 不同指令功能不同,复杂度不同,如何进行时间控制?
    • 定长指令周期: 早期三级时序系统
      • 机器周期数固定,节拍数固定,按机器周期同步,mips单周期
    • 变长指令周期: 现代时序系统
      • 机器周期数可变,节拍数可变,按时钟周期同步,mips多周期
      • 定长指令周期只是一种特例

数据通路及指令操作流程

数据通路

数据通路——执行部件间传送信息的路径 (数据流)

  • 通路的建立由控制信号控制,受时钟驱动 (控制流)
  • 不同指令、同一指令在执行的不同阶段的数据通路不同
  • 分类:共享通路(总线)、专用通路
    • 指令执行流程、执行效率
    • 微操作控制信号的时序安排

数据流动一般三种情况

  • 寄存器与寄存器
  • 寄存器与主存
  • 寄存器与ALU

CPU内部单总线结构

优点:设计成本更低

一个微操作要用一个时钟周期,CU发出控制指令完成微操作

  1. 寄存器之间的数据传送

    (PC)->Bus PCout有效,PC内容送总线

    Bus->MAR MARin有效,总线内容送MAR

    重要的是描述清楚数据流向

  2. 主存与CPU之间的数据传送

    比如CPU从主存读取指令:

    (PC)->Bus->MAR PCout和MARin有效,现行指令地址->MAR

    1->R CU发读命令(通过控制总线发出) 不要漏

    MEM(MAR)->MDR MDRinE有效

    MDR->Bus->IO MDRout和IRin有效,现行指令->IR

    关键:指明操作的主存地址放到MAR中,同时要通过CU给主存读/写信号

  3. 执行算术或逻辑运算

    参与加法指令的一个操作数已经存放在ACC里乐,另一个由加法指令指明存在在主存的哪个位置

    比如一条加法指令

    Ad(IR)->Bus->MAR MDRout和MARin有效(和间址周期一样,取指先从MDR赋值到IR的,所以可以直接从MDR取,送到MAR)或AdIRout和MARin有效

    1->R CU发读命令

    MEM(MAR)->数据线->MDR MDRin有效

    MDR->BUS->Y 加数 **ALU的两个输入信号必须同时有效,而内部总线同一时刻只能传输一个信号,要先存在暂存寄存器Y,与ALU有专用数据通路不用占用内部总线,实现了同时有效 **

    (ACC)+(Y)->Z ACC放到被加数、Y为被加数进行运算

    Z->ACC 加法结果存回ACC累加寄存器

单总线,需要把一个操作数放到暂存寄存器中

每一个时钟周期,CU发出控制信号实现一个微操作

image-20231202113136852

MIPS CPU典型指令

# 指令 指令功能 (RTL描述)
1 lw rt,imm(rs) R[rt] ← M[R[rs] +SignExt(imm)]
2 sw rt,imm(rs) M[R[rs] + SignExt(imm)]← R[rt]
3 beq rs,rt,imm if(R[rs]==R[rt]) PC←PC+4+SignExt(imm)<< 2
4 addi rt,rs,imm R[rt] ← R[rs] + SignExt(imm)
5 add rd,rs,rt R[rd] ← R[rs] + R[rt]

image-20231212102821524

image-20231114094517550

写入,表示一个节拍。四个节拍。 红色圆圈表示一个脉冲

image-20231114100713948

习题

ADD(R0),打了括号表示目的操作数,即存放的是R0在主存中的地址,需要进行一次间接寻址,而R1没打括号就是R1放的就是R1操作数

功能:指令打括号表示取出内容。((R0)+(R1)->(R0),意思就是首先(R0)在主存中取到R0的地址所指的内容放回R0,然后取出R0和R1的内容相加,结果放回R0

按取指周期、间址周期、执行周期来分析

image-20231202115449260

每取出一个值,PC都要加一,题目没有给出控制信号不写

image-20231228154031811

间址周期和之前的有不同,这里直接放到MDR中了

image-20231202115740980

上一步间址周期后,一个操作数已经放在Y了,加完的结果放回Z

结果写回主存所以要放到MDR

MemW写控制信号

这里注意M(MAR)什么意思,上一步中MAR的内容为(R0)也就是最终想要写回的主存地址,没有变,所以这里直接M(MAR)

image-20231205085400269

image-20231205085425019

image-20231205085447411

image-20231205085610873

image-20231205085725782

控制器的设计

  • 一个节拍内可以并行完成多个“相容的”微操作
  • 同一个操作可能在不同指令的不同阶段被使用
  • 根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定现在这个节拍下应该发出哪些“微命令”

image-20231205090919375

硬布线控制器

image-20231205092947245

设计步骤:

  1. 分析每个阶段的微操作序列(取值、间址、执行、中断 四个阶段) 确定哪些指令在什么阶段,在什么条件下会用到的微操作
  2. 选择CPU的控制方式 定长机器周期还是不定长,定长每个机器周期安排几个节拍 选定3个
  3. 安排微操作时序 如何用3个节拍完成整个机器周期内的所有微操作?
  4. 电路设计 确定每个微操作命令的逻辑表达式,并用电路实现

image-20231205094658285

安排微操作时许的原则

一:微操作的 先后顺序不得 随意 更改

二:被控对象不同 的微操作 尽量安排在 一个节拍 内完成

三:占用 时间较短 的微操作 尽量安排在 一个节拍 内完成 并允许有先后顺序

组合逻辑设计:

  1. 列出操作时间表
  2. 写出微操作命令的最简表达式
  3. 画出逻辑图

image-20231205100221132

非访存指令不需进入间址阶段,直接进入执行阶段

1->EX 进入执行周期

image-20231205100400359

image-20231205102430188

硬布线控制器的设计步骤

  1. 分析每个阶段的微操作序列
  2. 选择CPU的控制方式
  3. 安排微操作时序
  4. 电路设计
    1. 列出操作时间表
    2. 写出微操作命令的最简表达式
    3. 画出逻辑图

微程序控制器

微程序设计概念:将一条机器指令编写成一个微程序,每个微程序包含若干个微指令,每个微指令又对应一个或几个微操作命令

然后把这些微程序存到控制存储器中,用寻找用户程序的方法来寻找每个微程序中的微指令。

所以逐条执行每一条微指令,也就相应地完成了一条机器指令地全部操作。

链接:https://www.nowcoder.com/questionTerminal/307284997f254e14b235544811e36c25
来源:牛客网

先简单介绍下基本知识:

1) 微操作类型

​ 相容性微操作:同时或同一个CPU周期内可以并行执行的微操作。

​ 相斥性微操作:不能同时或在同一个CPU周期内并行执行的微操作 。

2) 微命令编码

​ 直接控制法:微指令控制字段的一种编码方法,每个微命令占一位。

​ 直接编码法:相斥的n个微命令可以采用编码法表示,占log2(n+1)位。

​ 混合编码法:相斥微命令采用直接编码法,相容微命令采用直接控制法。

3) 7个互斥的微命令采用直接编码法至少需要log27+1位,即3位。

​ 3个互斥的微命令采用直接编码法至少需要log23+1位,即2位。

​ 12个互斥的微命令采用直接编码法至少需要log212+1位,即4位。

​ 5个互斥的微命令采用直接编码法至少需要log25+1位,即3位。

​ 6个互斥的微命令采用直接编码法至少需要log26+1位,即3位。

​ 至少需要3+2+4+3+3=15位。答案为C

对比

image-20240102203753069

指令流水线

指令流水的定义

指令执行过程划分为不同阶段,占用不同的资源,就能使多条指令同时执行

表示方法:指令流程图、时空图

image-20231202154730864

每个流水阶段的执行时间一样,都等于一个时钟周期

流水线性能指标

  • 吞吐率,单位时间内流水线所完成的任务数量,或是输出结果的数量
  • 加速比
  • 效率

影响因素和分类

机器周期的设置

五段式指令流水线 MIPS架构

  • IF Fetch 取值
  • ID Decode 指令译码
  • EX EXecute 执行
  • M Memory 存储器访问
  • WB Writerback 写回周期

五个阶段耗时不完全一样但是为了方便流水线设计,取成一样的,以最长耗时为准

IF

默认从Cache命中取值,放到锁存器中

ID——读

大部分都是从Cache命中数据,分为两个模块,分别存指令和数据

Instruction Cache,Data Cache

RISC精简指令下,ID阶段取数直接来自寄存器而不是主存了(在主存也得先取到寄存器)

ID的锁存器有一个Imm表示立即数。有的指令食用立即寻址,直接从指令取出所需的立即数放到Imm

EX

ALU运算结果直接写到M的锁存器,接着有可能需要写回前面的某个寄存器中

WB——写

image-20240103010612938

ID和WB涉及到对寄存器的读和写,会造成一些问题

三种因素

  • 结构相关(资源冲突) 互斥
    • 后一相关指令暂停一周期
    • 资源重新配置:数据存储器+指令存储器。规定取值和访存在不同的cache体就好了

image-20240103091537521

  • 数据相关(数据冲突) 同步 前一条执行后一条才能执行
    • 等待,硬件阻塞(stall)和软件插入”NOP”两种方法(发现前后数据冲突则在之间插几条空指令)
    • 数据旁路技术,结果直接输入到后面,不共用同一个了
    • 编译优化,通过编译器调整指令顺序来解决数据相关

在读出r1之前,需要保证之前已经把r1写回了!读出是在ID,写回是在WB

image-20240103092055373

硬件阻塞等待(气泡),将ID延迟到W之后;软件空指令也是完整的指令,插入到前面

气泡

空指令

数据旁路:写回太久了,不等寄存器取了,直接在上一条的ALU中取,送回ALU的输入端,作为下一条指令ALU的输入

image-20240103092700568

编译优化:把后面不冲突的先移上来执行,冲突的后移

  • 控制相关(控制冲突) 流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关
    • 转移指令分支预测:简单预测、动态预测
    • 预取转移成功和不成功两个控制流方向的目标指令
    • 加快和提前形成条件码
    • 提高转移方向的猜准率

转移指令条件不满足,顺序执行,当满足时,发生跳转,PC的指发生跨越(本来是加1一指令长度,如指令长度为4B,每次加4B,有可能一下跳转到100B)。那么跨越中间的指令是不应该执行的

分类 *了解

1 部件功能级、处理机级和处理机间流水线

2 单功能流水线和多功能流水线

3 动态流水线和静态流水线

4 线性流水线和非线性流水线

流水线的多发技术

  1. 超标量技术 在一个时钟周期内可以并发多条独立指令,要配置多个功能配件

    image-20231202164955938

    不能调整 指令的执行顺序

    通过编译优化技术,把可并发执行的指令搭配起来

    空分复用

  2. 超流水技术 在一个时钟周期再分段

    一个时钟周期内 一个功能部件使用多次

    image-20231202165235054

    不能调整 指令的执行顺序

    靠编译程序解决优化问题

  3. 超长指令字

    由编译程序挖掘出指令间潜在的并行性

    多条并发操作的指令组合成一条

    具有多个操作码字段的超长指令字(可达几百位)

    采用多个处理部件

    image-20231202165510524

五段指令

image-20231212091136347

image-20231212091237504

存储系统

主存储器的基本组成

DRAM与SRAM

双稳态触发器vs栅极电容

image-20231219094655865

刷新是指电容的电荷维持时间有限,不充电信息会消失,要定时刷新(充电)

存储矩阵,用行地址和列地址选中一个存储单元(减少选通线的数量,电路更简单)

image-20231219095241115

DRAM分两次送是因为它本身容量大,将行地址和列地址送,可以再减少选通线的数量到n/2(实现从2n->n->n/2 )

ROM

RAM断电丢失,主存,ROM辅存

image-20231219103244870

提升主存速度

存取周期

可以连续读/写的最短周期

image-20231219104453473

双口RAM

多核CPU如何访存?

image-20231219104402105

多体并行存储器

体号+体内地址

低位高位不同,高位竖着编、地位横着编

image-20231220151935231

多模块存取器

image-20231220152103620

image-20231220152124844

多体并行存储器灵活性更高

主存和CPU连接

image-20231226100226657

现代的MARMDR集成在CPU中

image-20231226100309438

A表示地址,D表示数据

片选信号CS或CE,有横线说明低电平有效

读写控制线WE或WR,有横线说明低电平表示写

image-20231226100546520

位扩展

8Kx1位

  • 8K为2^13有13根地址线,A13根
  • 1位说明一次数据总线只能传输一位数据

如果只装这一个芯片,那么主存的存储字长只有1bit,数据总线8位并没有被充分利用

加多一块,一样的,则存储字长拓展为两位,即可以同时读同时写两位数信息image-20231226101206072

接着继续扩展6个芯片

image-20231226101331477

字扩展

两种方法

  • 线选法,两根线来控制CS,但是只能一个1一个0,不能同时位1或0

  • 译码器片选法,一根线控制,连两个,但是连第一个的中途加一个非门,这样当为1另外一个就是0,这就是1-2译码器,1条线有2个片选信号。

    • n条线可以对应2^n个片选信号(组合)

      image-20231226102330788

image-20231226103531117

那么如果增加A15进来,则为3-8译码器,能够拓展多4块芯片

线选法 译码片选法
n条线→n个选片信号 n条线→2n个选片信号
电路简单 电路复杂
地址空间不连续 地址空间可连续

高速缓存

映射方式

cache和主存块大小相等,本身放的是数据

cache的标记位其实就是主存的块号(编号)

cache和主存块数不相同

image-20231220213655854

image-20231220214829155

image-20231220214840792

image-20231222103757308

全相联

image-20231220224011669

在这里插入图片描述

直接相联

image-20231220223943017

img

组相联

image-20231220223915163

img

总结

image-20231220224035725

写策略

可以命中的情况:

  • 写回
  • 直(全)写,在cache和主存之间加写缓冲

image-20231222105143890

使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞

image-20231222105416448

写不命中(写的地址不cache):

  • 写分配法:先从主存调入cache再写,然后配合写回法使用
  • 非写分配:不调入cache,cpu直接写主存

现代计算机常采用多级Cache