前言
本文主要是介绍武汉理工大学计算机组成原理这门课程的期末考试重点。
重点章节:计算机系统基础、存储器、运算器、CPU分析与设计
一、计算机系统基础
1. 10 进制数的 16 进制表达(注意:有符号最高位为 1,表示负数, 用补码表示)
步骤:先转二进制;接着判断为负数or正数;正数为原码,负数为补码;二转十六
例题:求259与-259的十六进制
259 = 0000 0001 0000 0011 = 0x103
-259 = 1000 0001 0000 0011原 = 1111 1110 1111 1101补 = 0xFEFD
2. 16 进制数的 10 进制表达(注意:有符号最高位为 1,表示负数, 用补码表示)
步骤:先转二进制,若第一位为1,则此二进制为补码求原码转十进制即可,若第一位为0,则直接转十进制即可。
例题:short int x = 0x800F,unsigned short int y = 0x800F,求x,y的十进制
x = 1000 0000 0000 1111 x为补码,则x原 = 1111 1111 1111 0001 = -32753
y = 1000 0000 0000 1111 y为无符号数,则y原 = 1000 0000 0000 1111 = 32810
注意:有符号数与无符号数
3. IEEE 754 标准 float 浮点数表达(1 位 / 8 位 / 23 位)
IEEE 754 标准为:
符号(1位) | 阶码(8位) | 尾数(23位) |
例题:求float f = -60.6875,在计算机中的IEEE 754的表达形式
60 = 0x3c = 11 1100 0.6875 = 0.1011
则60.6875 = 11 1100. 1011
规范化表示:11 1100.1011 = 1.111001011 * 2101
故阶码为0111 1111 + 0000 0101 = 1000 0100
尾数为111 0010 1100 0000 0000 0000 0000 (直接补0)
符号位为1
所以IEEE 754 标准下的-60.6875为 1,10000100,111 0010 1100 0000 0000 0000 0000
4. RAM 中数据存储结构图(包含地址、每个地址所存储的 16 进制 数值、以及地址单元与变量之间的对应关系;注意大端模式与小端模式)
大端模式:数据的高字节在内存的低地址
小端模式:数据的高字节在内存的高地址
例题:假设int型和float型均为4字节长,short int型为2字节,存储器的存储字长为8位,数据在存储器中按照小端模式存储。则运行下述程序后,变量i和f的值分别为多少(用10进制表示)?
i = 256 = 0x00 00 01 00;f = 0xC2 72 C0 00 小端模式中 i f
*p = 0x00;*q = 0xC0 00 赋值之后 i = 0x00 00 00 00 = 0;f = 42 A9 C0 00 = 84.875 |
5. C 转汇编:for 语句、if / else 条件分支语句、函数调用、变量赋值 4 种类型的 C 语言语句的汇编空缺补充。
For语句
通过lw指令,将变量b的值载入到寄存器a3中; 通过li指令,将变量i的初值载入a5中; 使用bge判断i>=b是否满足,满足则跳转到800008a,否则向下执行。 接着执行循环体与i++,然后使用bne判断i != b(即i<b),若满足则跳转到800007a(回去),否则向下执行 |
If/else语句:bne指令;bge指令;blt指令
bne指令: bne rs1,rs2,label à if rs1 != rs2 pc = label else pc = pc + 4
bge指令: bge rs1,rs2,label à if rs1 >= rs2 pc = label else pc = pc + 4
blt指令: blt rs1,rs2,label à if rs1 < rs2 pc = label else pc = pc + 4
例:if(m==n) a+=2; else b+=3; 用汇编语句编写。假设变量m、n值分别存在寄存器a4、a5中,else语句地址为0x2008
bne a4,a5,0x2008
函数调用语句:参数传递;现场保存与跳转;子函数参数获取;现场恢复与函数返回;返回值传递
参数传递:使用lui,lw,li指令将需要传递的参数分别从a0一直存到an寄存器中。
现场保存与跳转:使用jal指令跳转到函数的地址(会保存现场到x1中)
子函数参数获取:分别从寄存器a0到an来读取参数的值。
现场恢复与函数返回:使用ret指令修改pc = x1
返回值传递:返回值为4字节,使用寄存器a0传递返回值;返回值为8字节,使用2个寄存器a0、a1传递返回值。
变量赋值语句:常量对变量赋值;变量对常量赋值
常量对变量赋值的步骤:使用lui指令和addi指令获取变量的地址存入寄存器中;使用li指令将常量值存入寄存器中;使用sw指令将a4的值写入变量的地址处。
例如:实现s[0]=20;的汇编代码
lui a5, 0x20000
addi a5, a5, 12 #0x2000000c<s>
li a4, 20
sw a4,0(a5)
变量对变量赋值的步骤:使用lui指令与lw指令将变量的值读入寄存器中;使用sw指令将变量的值写入需要赋值的变量中。
例如:实现s[1]=a;的汇编语句
lui a5, 0x20000
lw a4, 4(a5) #0x20000004<a>
sw a4, 20(a5) #0x2000000c<s>
6. 汇编转机器码:汇编语句向机器码语句的转换方法,包含 lui、lw、 jal、addi 这 4 种指令的转换方法。
lui指令:lui rd,imm[19:0] 将左移12位的立即数imm左移12位写入rd中
例:lui a5,0x20000 à 执行完后 a5 = 0x20000000
Imm[31:12](20位) | Rd(5位) | 0110111(7位) |
addi指令:addi rd,rs,imm[11:0] 将rs与imm相加的结果写入rd中
例:承接上题,addi a5,a5,12 à 执行之后a5 = 0x2000000c
Imm(12位) | Rs(5位) | 000 | Rd(5位) | 0010011(7位) |
lw指令:lw rd,offset(rs1) 从地址offset+rs1中读出的值存入rd中
Imm(12位) | Rs(5位) | 010(3位) | Rd(5位) | 0000011(7位) |
例:lw a4,4(a4) #a4 = 0x20000000 20000004<a> à 执行之后a4 = a
Jal指令:jal label 用于函数调用跳转到label处,x1 = pc+4(保存现场)pc = label
例:80000d6: jal 8000058 à 将80000da保存到寄存器x1中,pc跳转到8000058
非压缩
Imm[20|10:1|11|19:12](20位) | Rd(5位) | 1101111(7位) |
压缩
001(3位) | Imm[11|4|9:8|10|6|7|3:1|5](11位) | 01(2位) |
其中imm = (label - PC)/ 2;
二、存储器
1. 直接映射、全相联映射、组相联映射 3 种方式的地址格式划分。
直接映射方法:
标记位(L-b-c位) | 映射到的Cache块号(c位) | Cache块内地址(b位) |
Cache块大小为B=2^b,Cache的块数为C=2^c
例题:设主存容量为512KB,Cache容量为4KB,块大小为4B,按字节寻址(每个地址存放1个字节)。求直接相联地址格式
地址线为:512KB=2^19B -> 19根;Cache块数:4KB/4B = 2^10 -> 10位;
Cache块内地址:4B = 2^2 -> 2位; 故地址格式为
标记位(7位) | 块号(10位) | 块内地址(2位) |
全相联映射方法:
标记位(L-b位) | Cache块内地址(b位) |
Cache块大小为B=2^b;
例题:假设块大小为512B,按字节编址。Cache数据区容量为8KB,主存地址空间为1MB。
求全相联映射地址格式。
地址线:1MB = 2^20B -> 20根;Cache块内地址:512B = 2^9B -> 9位;地址格式为:
标记位(11) | Cache块内地址(9) |
组相联映射方法:n个块分为一组就是n路相联
标记位(L-b-c) | 组号(c位) | Cache块内地址(b位) |
Cache块大小为B=2^b;Cache块数为C;组数 = C/n = 2^c
本质:分组属于直接相联;组内分块属于全相联
例题:假设主存和Cache之间采用2路组相联映射,块大小为512B,按字节编址。Cache数据区容量为8KB,主存地址空间为1MB。求组相联地址格式
块内512B = 2^9B -> 9位;Cache块数 = 8KB/512B = 2^4个;组号 = 2^4/2 = 2^3 -> 3位
标记位(8位) | 组号(3位) | Cache块内地址(9位) |
2. 采用上述 3 种映射方法时,CPU 访问某个主存地址单元的方法。
直接相联:首先主存的块号,核对标记位;标记位为空,导入;标记位一致,已经被导入,直接访问块内地址;标记位不同,替换算法,访问块内地址。
全相联:循环遍历全部Cache块对比标记位;接着与上一致。
组相联:首先寻找地址对应的组号,接着循环遍历组内全部Cache块对比标记位;同上。
3. 给出一个存储器与 CPU 的连接电路图,写出存储器的地址范围。
确定存储器1与存储器2的地址范围
想要存储器正常工作,则片选信号CS = 0;
故A4=0、A5=1时存储器1正常工作;存储器1的地址集合可以表示为10****其中****的取值为0000 – 1111;综上所述存储器1的地址范围为:100000-101111(0x20-0x2F)
A4=0、A5=0时存储器2正常工作;存储器的地址集合可以表示为00****;故存储器2的地址范围为(0x00-0x0F);
4. 给出存储器的地址范围,要写画出存储器与 CPU 的连线(涉及到位扩展与字扩展)。
对下述CPU与存储器之间的引脚进行连接,从而使存储器的地址范围为: 0x04~0x07,0x14~0x17,0x24~0x27,0x34~0x37. |
首先转为2进制发现 A3与A2始终不变为01,因此A3A2用来决定片选信号CS。
接着将A5,A4,A1,A0随意连接到存储器A3A2A1A0上即可。
位扩展(增加存储字长(数据位)):多个存储器共用地址线,扩展数据线,即两个存储器并联
字扩展:数据线共用,扩展地址线,地址高1位连接到CS端,用于片选不同的存储器。
三、运算器
1. 证明题(PPT 上出现的证明题)
证明题1:将 X补 连同符号位在内,所有位均取反,末位加1,即得 [-X]补
(1)假设X为正数:X = 0.X1X2X3…Xn
假设 X1X2X3…Xn 每位取反,末位加1后的值为: Y1Y2Y3…Yn
则:X补 = 0.X1X2X3…Xn
-X = 1.X1X2X3…Xn
[-X]补 = 1.Y1Y2Y3…Yn
比较 X补 与 [-X]补 的值可看出,对 X补 连同符号位一起,所有位取反,末位加1,可以得到[-X]补。
(2)假设X为负数, X = 1.X1X2X3…Xn
则: X补 = 1.Y1Y2Y3…Yn
-X = 0.X1X2X3…Xn
[-X]补 = 0.X1X2X3…Xn
比较 X补 与 [-X]补 的值可看出,对 X补 连同符号位一起,所有位取反,末位加1,可以得到[-X]补。
证明题2:若 X原 为负数,则 X原 数值位每位取反,末位加1,即得X补
证明题3:两位正数或负数相加溢出时,为什么结果的符号会与原操作数的符号不同?
情况一:正数+正数
设A = 0.A1A2A3…An, B = 0.B1B2B3…Bn
若相加无溢出,则数值相加无进位,结果符号位为0
若相加有溢出,则数值相加有进位,结果符号位变成1,与操作数符号不同。
情况二:负数+负数
设A = 1.A1A2A3…An, B = 1.B1B2B3…Bn, A补 = 1.a1a2a3…an, B补 = 1.b1b2b3…bn
若原码A1A2A3…An + B1B2B3…Bn溢出,则补码a1a2a3…an+ b1b2b3…bn不溢出,结果的符号位为0
若原码A1A2A3…An + B1B2B3…Bn不溢出,则补码a1a2a3…an+ b1b2b3…bn溢出,结果的符号位为1
证明题4:为什么2位符号位的操作数相加时,结果的2位符号位不同,则发生溢出?
情况一:正数 + 正数
设A = 00.A1A2A3…An, B = 00.B1B2B3…Bn,A补 = 00.A1A2A3…An, B补 = 00.B1B2B3…Bn
若 A+B 无溢出,则 A补+B补 数值相加无进位,结果符号位为00
若 A+B 有溢出,则 A补+B补 数值相加有进位,结果符号位变成01
情况二:负数+负数
设A = 11.A1A2A3…An, B = 11.B1B2B3…Bn, A补 = 11.a1a2a3…an, B补 = 11.b1b2b3…bn
若 A+B 无溢出,则 A补+B补 数值相加有进位,结果符号位为11
若 A+B 有溢出,则 A补+B补 数值相加无进位,结果符号位变成10
情况三:正数+负数
设A = 00.A1A2A3…An, B = 11.B1B2B3…Bn, A补 = 00.A1A2A3…An, B补 = 11.b1b2b3…bn
当A1A2A3…An+ b1b2b3…bn有进位则符号位为00
当A1A2A3…An+ b1b2b3…bn无进位则符号位为11
符号位始终相同所以没有溢出。
证明题5:在进行加法运算时,不仅对数值进行了相加,也将符号位和数值同等对待,对符号位也进行了相加。那么,将符号位和数值同等对待进行相加后,得到的结果的符号位也会是正确的吗(不考虑溢出)?
情况一:正数 + 正数
设A = 0.A1A2A3…An, B = 0.B1B2B3…Bn
因为相加无溢出,则A补+B补不溢出则符号位始终为0,符号位正确
情况二:负数+负数
设A = 1.A1A2A3…An, B = 1.B1B2B3…Bn, A补 = 1.a1a2a3…an, B补 = 1.b1b2b3…bn
因为相加无溢出,则a1a2a3…an+ b1b2b3…bn有进位,故符号位为1,符号位正确
情况三:正数+负数
设A = 0.A1A2A3…An, B = 1.B1B2B3…Bn, A补 = 0.A1A2A3…An, B补 = 1. b1b2b3…bn
(1)|A|>|B|,则A1A2A3…An+ b1b2b3…bn有进位,故符号位为0,符号位正确
(2)|A|<|B|,则A1A2A3…An+ b1b2b3…bn无进位,故符号位为1,符号位正确
2. 加减运算以及溢出判断(注意用补码运算,且注意正数的补码是其本身)
加法
定点小数加法求解步骤
1)求解[A]补,求解[B]补
2)根据([A]补+[B]补)mod 2 = [A+B]补,计算出[A+B]补
3)根据[A+B]补,求解出A+B
例:设A = 0.1011,B = -0.0101,求A+B。
[A]补 = 0.1011;[B]补 = 1.1011;[A]补+[B]补 = 10.0110;按照定义mod2得[A+B]补=0.0110
故A+B=0.0110
定点整数加法求解步骤
1)求解[A]补,求解[B]补
2)根据([A]补+[B]补)mod 2 n+1 = [A+B]补,计算出[A+B]补
3)根据[A+B]补,求解出A+B
例2:设A = -1001,B = -0101,求A+B
[A]补 = 1, 0111;[B]补 = 1, 1011;[A]补+[B]补 = 11,0010;按照定义mod2n+1得[A+B]补=1.0010
故A+B=1.1110 = -14
加法溢出判断
一位符号位溢出的条件:两个操作数符号相等;结果符号与操作数符号不同
例:已知A = -11/16,B = -7/16,求A+B
求解:A = -11/16 = 1.1011 ;B = -7/16 = 1.0111;[A]补 = 1.0101;[B]补 = 1.1001
[A+B]补 = 1.0101+1.1001=10.1110
模2后,去掉最高位1, 故[A+B]补 = 0.1110,即A+B = 0.1110
溢出判断:A与B的符号位均为1,而结果符号位为0,与操作数不同,故发生溢出
两位符号位溢出的条件:运算结果的2位符号位不同,则判定为溢出(结果符号为01,代表正溢出;10是负溢出)
例:设x = -11/16,y=-7/16,试用变形补码(即2位符号位补码)计算x+y
解:x = -11/16 = 11.1011,y=-7/16 = 11.0111
[x]补 = 11.0101,[y]补 = 11.1001
[x]补 + [y]补 = 11.0101+11.1001=10.1110
符号位为10,2个符号位不同,故结果溢出。第1位符号位为1,故表示是负相加溢出
减法
求解A-B;即看作求解A+(-B)即可。
四、CPU 分析与设计
1. 给出 Regfiles 寄存器堆、ALU、分线器、多路选择器等组件,需进行连线,设计出特定指令功能的电路。
ROM用于存储指令,RAM用于存储数据。
|
|
|
Regfiles 寄存器堆
寄存器读操作
每次可同时读2个寄存器
(a)控制线:L_S = 0
(b)地址线:R_addr_A、R_addr_B指定要读的寄存器地址
(c)数据线:rdata_A、rdata_B输出所读的寄存器数据
例如,当L_S = 0,R_addr_A = 010112,R_addr_B = 110012时,rdata_A = R[11], rdata_B = R[25]。
寄存器写操作
(a)控制线:L_S = 1
(b)地址线:Wt_addr指定要写的寄存器地址
(c)数据线:Wt_data即为要写到指定地址的数据值
例如,当L_S = 1,Wt_addr = 010112,Wt_data = 0x8086ABCD,则将数值0x8086ABCD写入到寄存器R[11]中,使R[11] = 0x8086ABCD。
ALU: 算法逻辑运算单元
(1)算术运算(加减);逻辑运算(与,或,异或,或非,移位)。
(2)两个操作数A、B。
(3)可以执行8种运算操作,由ALU_operation(2:0)来决定执行何种运算操作。
(4)运算结果从res端口输出。
(5)zero和overflow为运算结果的状态标记位。
当运算结果为0时,zero状态位被设置为1。
当运算结果溢出时,overflow状态位被设置为1。
分线器:分线器在电路中用一个三角符号表示,当需从一个信号线数较多的信号端提取出一部分信号时,可用分线器来实现。
例如:输入CPU中的指令总共 32 位,也即 inst_in(31:0)。已知指令的最高 6 位 inst_in(31:26)是操作码,最低 6 位 inst_in(5:0)是功能 码,若要提取出这 2 个字段,则可以使用 2 个分线器。
假设信号 A = 010110 00000 00000 00000 00000 101010,则经分线后,信号 B = 010110,信号 C = 101010。 |
多路选择器:从多个输入信号中,选择1个作为输出。究竟选择哪1个作为输出,由控制信号s决定。如果有n个输入,则s的位数为:log2n
PC程序计数器(PC指针)
(1)Q端口:读PC值端口,当前PC指针的值可从Q端口读出。
(2)D端口:写PC值端口,如果需要修改PC指针为新的值,需将新的值从D端口输入,从而实现对PC指针值的修改(写PC值时,CE信号需为1)。
加法器
a、b为加法器的输入信号端口,相加的结果从端口c输出。也即:c = a + b。
2.给出 MIPS CPU 数据通路的电路,分析指令在 CPU 上时如何解析以实现指令的功能(仅考 PPT 上几种指令:add、J、SW、beq)。
看PPT即可