计算机组成原理期末复习比较

工作原理:

  • 存储程序:将程序存放在计算机的存储器中

  • 程序控制:按指令地址访问存储器并取出指令,经译码依次产生指令执行所需的控制信号,实现计算的控制,完成指令功能

计算机组成
硬件

主机部分:运算器(CPU)+控制器(CPU)+内存储器(内存)。

  • 运算器:算术运算(+、-、*、\);逻辑运算(与、或、非、移位、异或等);基本结构(寄存器、连接通路)

  • 控制器:控制程序和数据的输入、运行处理运算结果

  • 存储器:用于储存数据、运算中间结果,容量为1K = 10条地址线,1M=1024k=20条地址线就是2^10幂

外设部分:I/O输入设备(键盘、鼠标、网卡)、I/O输出设备(打印机、显示器)、外存储器(U盘)

主线部分:地址线、数据线、控制线

软件

系统软件:操作系统、网络系统、编译系统

主频(f)

指CPU内核工作的时钟频率,CPU内数字脉冲信号震荡的速率

时钟周期(T)

节拍周期,计算机中最基本的、最小的时间单位,f越高,T越小

CPI(Clock cycles Per Instruction)

执行一条指令需要的时钟周期数(即时钟周期的个数)计算公式: C P I = 程 序 中 所 有 的 指 令 时 钟 周 期 之 和 程 序 指 令 总 数 CPI = \frac{程序中所有的指令时钟周期之和}{程序指令总数} CPI=

与之相反的是IPC:每个时钟周期执行的指令条数

MIPS(Million Instructions Per Scond)

每秒钟执行的指令条数(单位:百万条/秒)公式如下: M I P S = 指 令 条 数 执 行 时 间 ∗ 1 0 6 = 指 令 条 数 ( 程 序 中 所 有 的 指 令 时 钟 周 期 之 和 / f ) ∗ 1 0 6 = 指 令 条 数 ∗ f 程 序 中 所 有 的 指 令 时 钟 周 期 之 和 ∗ 1 0 6 = f C P I ∗ 1 0 6 MIPS = \frac{指令条数}{执行时间*10^6} = \frac{指令条数}{(程序中所有的指令时钟周期之和/f)*10^6} = \frac{指令条数*f}{程序中所有的指令时钟周期之和*10^6} = \frac{f}{CPI*10^6} MIPS=106=(/f)106=106f=CPI106f

机器数

小数二进制转换

5 16 \frac{5}{16} 165的二进制数。 5 16 \frac{5}{16} 165 = 1 16 \frac{1}{16} 161 + 1 4 \frac{1}{4} 41 = 0.0101

快捷方法:首先将分母转换为2的次方数,这里是16所以不需要转换,求出5的二进制数为0101,因为是小数所以左移(变小)24大小,那么就是左移4位,结果就是0.0101

模运算:

数学定义公式:x mod y = x - y ⌊ x / y⌋

即x模y = x - (y * x与y的商的下界)

//最简单的模运算比如说10 mod 3 那么就是10/3取余,则10 mod 3 = 1。
题目1:以时钟为例子当前时间5点想要调至到12点
答:
方法一:减去5个点则表示-5
方法二:加上7个点则表示7
那么此时负数取模则表示为 -5 mod 12 = 7 ,当然7 mod 12 != -5因为正数取模就是取余运算7<12那么取余就是本身7 mod 12 = 7

题目2:在32位程序中-5的取模公式是?
答:根据题目条件得出公式:-5 % pow(2,32)

题目3:-3 mod 2结果为?
答: 
//负数取模
-3 mod 2 
= -3 - (2 * ⌊ -3/2 ⌋) 
= -3 - (2 * ⌊ -1.5 ⌋)  //这里是取-3与2的商的向下取整
= -3 - (2 * -2)
= -3 + 4
= 1
//正数取模
10 mod 3 
= 10 - 3 * ⌊ 10/3 ⌋
= 10 - 3 * 3
= 1

反码计算:

问题:已知:x=1101 , y=-1010 用反码运算求 x+y
答: 
x[反] = 01101 y[反]= 10101
x[反]+y[反]=1000010  //此时结果明显不对需要再将溢出进位拿出去并去掉进行相加
x[反]+y[反] = 000010 + 1 = 000011

补码计算:

//模:补码中符号位进位后所在位的权值
问题:-1用补码表示,下列哪个是正确的?
A.11 B.111 C.1111 D.11111 E.111111
答:因为题目没有规定字长场景那么答案是ABCDE
问题:整数x补码形式为X0X1X2X3X4X5,此时的-1补码是?模是?
答:根据形式格式判断可知字长格式为6位,那么-1[补]=111111,模为2^6
问题:字长为32位的机器采用补码数据表示时其模为?
答:2^32

移码计算:

定义:将补码的符号位取反
原理:该数加上一个偏移。机器字长为n时,偏移量为2^(n-1),X为正整数时即X[移] = 2^(n-1) + X
真值:1101100
01101100[原]  = 01101100[反] = 01101100[补] = 11101100[移]
真值:-1101100
11101100[原] = 10010011[反] = 10010100[补] = 00010100[移]

定点与浮点数据

定点

定义:可表示小数、整数

表现形式:X0.X1X2X3…Xn(定点小数)、X0X1X2X3…Xn.(定点整数)

不足:数据表示的范围有限

定点小数:如x=0.1011、y=-0.1011 则对应的机器码为x[原] = 0.1011 y[原]=1.1011 其中小数点前的0被忽略了

浮点

当数的范围超出了定点数能表示的访问则使用浮点数

定义:把数的范围和精度分别表示的一种数据表示方法;例如:ESE1E2…EnM1MsM2…Mn (E表示阶码位数,数据的范围。M表示尾数位数,决定数的精度) ⟶ \longrightarrow N = m * 2e ,例如11100.101b,向左移5位变成规格化的0.11100101然后再移回来规格化后的浮点数就是0.11100101 * 2 101(101表示5的二进制)

IEEE 754格式数据:

单精度:1符号位+ 8位偏指数+23位尾数(比如C中的float占4字节)

双精度:1符号位+11位偏移数+52位尾数(比如C中的double占8字节)

IEEE 754转换公式:(-1)s * 2e * 1.M

IEEE 754浮点格式中的阶码部分采用的是移码,所谓移码就是增加一个增量进行位移得到的数叫价移,那么单精度这个位移值就是2^7 -1 (127),双精度就是2^10 -1 (1023),是通过它们的偏指数位数得来的。 这样做的原因是为了将浮点数的阶码值变成非负整数,便于浮点数的比较和排序
IEEE 754尾数形式为1.XXXXXXX,其中浮点数中的M部分保存的是XXXXXX(1被省略了)从而可以保留更多的有效位

例题:

问题1:设浮点数字长16位,其中阶码5位,尾数11位,求-58(十)的二进制定点数和浮点数并分别它的定点机、浮点机的机器数形式。
答:
-58 d = '-111010'b
定点数:补齐长度为尾数位长度;-0000 1110 10,这里加符号刚好11位
浮点数:对齐格式为因为-58是一个整数所以浮点数的格式为0.xxxxx这里就是-0.111010,我们将小数点左移了6位,那么就要补回来再乘以2^6次方用科学计数法表示就是2^110,最后结果就是 -0.111010 * 2^110(规格化,不能计算成2的110次方)
定点数机器码:x[原] = 1,00011 1010 x[反] = 1,11100 0101 x[补] = 1,11100 0110
浮点数机器码: 阶数 x[原] = 0,0110 , 尾数 x[原] = 1,1110 1000 00 ,x[阶移,尾数] = 阶数+移码(补码符号位取反)+尾数(要转换成补码) = 1,0110;1 0001 1000 00

问题2:用IEEE 754格式中表示-58(十)的浮点数形式。
答:
在32位中:尾数部分转换为1.XXXX形式,那么就是1.11010左移了5位,那么阶数就是00000101(5的原码),再将阶数转换为阶移,那么就是x[阶原] = 00000101  ----> x[阶原]+float偏移值(32位)  ----> x[阶原] + 2^7 -1   ----> x[偏移]10000100 (备注!计算偏移快捷方法就是先将它原码变为移码然后减去1)
尾数:x[尾] = 11010 0000 0000 0000...00(共23位)
那么32位的浮点数形式为:1 10000100 11010000000000000000000(共32位,格式:符号位+偏移数+尾数)

在64位中:尾数:11010000....(共52位) 偏移数:10000000100(共11位)
那么64位的浮点数形式位:1 100000000100 11010000....(共64位)

问题3:用IEEE 754格式中表示20.59375(十)的浮点数形式。
答:
x[真] = 20.59375 = pow(2,4) + pow(2,2) + pow(2,-1) + pow(2,-4) + pow(2,-5)
x[原] = 0,10100.10011
x[尾数] = 1.010010011(左移了4位)
x[偏移] = pow(2,4)+pow(2,7)-1 = 00000100 + 127 -1 = 10000011
最终格式:0 10000011 01001001100000000000000(格式:符号+偏移数+尾数)
十六进制:0x41a4c000
码距的计算

码距:用于检测编码是否错误

将两个位串进行异或(xor)再计算异或运算结果中的1的个数,例如:110 xor 011 = 101 那么码距就是2

定点数运算及溢出检测

整数 :先转换为补码运算再模最高符号位的进位所在的权值,那么就是2n+1 (n表示除符号位的位数)

小数:先转换为补码运算再模2 0+1 (因为是小数所以最高符号位进位的权值就是20+1)

如下列:

//补数的相反数
问题:分别求出y[补] = 10011和y[补]= 11, 的-y[补]  
答:
y[补]= 10011 = y[原] = 11101 ;-y[原]  = 01101 ; -y[补] = 01101  
y[补]= 00011 = y[原] = 00011 ;-y[原]  = 10011; -y[补] = 11101
结论:根据一个补数求该相反数的补数,将所有位取反再加一
//整数运算
问题:x=10101 y=10010 求x-y
答:
x[补] = 0,10101; y[补] = 0,10010
x-y = x+(-y) = x[补] + (-y[补]) mod 2^(n+1)
= (0,10101 + 1,01110 ) mod 2^(5+1)
= 10,00011 mod 2^(5+1)
= 10,00011 mod 10,00000
= 0,00011 //正常程序执行公式  //也可通过将结果进行反码转换原码得到
= 11
//负数小数运算
问题:x=-0.1011,y=-0.0110 , 求x-y
答:
x[补] = 1.0101 ; y[补] = 1.1010 
x-y = x+(-y) = x[补] + (-y[补]) mod 2^(n+1)
= (1.0101 + 0.0110) mod 2^(0+1)
方式一: 1.1011 mod 2  //mod 2^(n+1) 等价于 反码转换原码 因为这里是小数所以n为0 那么就是mod 2^1
方式二:反码:1.1011 -> 原码:1.0101 -> 真值 : -0.0101 -> 十进制:-0.3125
溢出

溢出例题:

问题1: x=+10010 y=+10101 求x+y
x+y[补] = 100111 
x+y = 100111 mod 2^(6+1)
x+y = 100111 mod 1000000
x+y = 100111
x+y = -11001(同号相加符号位发生改变,溢出!)
问题2:x=-10010 y=-10101 求x+y
x+y[补] = 1,01110 + 1,01011 = 10,10001
x+y = x+y[补] = 10,10001 mod 2^(5+1) = 0,10001
x+y = +10001(溢出!!!)

由上例可得出溢出只会在同号运算时发生。

进位异或判断溢出:

同号运算补码的状态下,最高数据位进位 xor 符号位产生的进位 结果为1则溢出

如上面问题1中溢出表达式为:(1+1) xor (0+0) --> 1 xor 0 --> 1 溢出

如上面问题2中溢出表达式为:(0+0) xor (1+1) --> 0 xor 1 --> 1 溢出

双符号位判断溢出:
问题:x=0.1101 y=-0.0111 ,用补码求x+y , x-y
答:
x[补] = 0.1101 , y[补] = 1.1001 , -y[补] = 0.0111
x+y = (x[补] + y[补]) mod 2^(4+1) = 10.0110 mod 2^(4+1)  = 0.011 = 0.375 
x-y = (x[补] + (-y)[补]) mod 2^(4+1) = 01.0100 mod 2^(4+1) = 1.01 = -0.25 (显然结果是错误的)

上述的例子中x+y是异号运算那么使用进位异或的方法就不行了,可以看到这里的最高数据位有进位,那么这时

符号位就有了两位,这时就叫做双符号位 (注意!!! 转换为双符号位时变形补码后取模就是取 2n+2)。

正溢出:当该位数存储最大值时,再给它加上1那么就会将符号位0变为1,此时就是溢出了(如(215-1)+1 )

215如下:

0111111111111111

215+1后的结果

1000000000000000

负溢出:最该位数存储最小负值时(不是最小值),再减去1那么就会将符号位1变为0,如下所示:

1000000000000000

-1后的结果

0111111111111111

双符号位时,00表示正号,11表示负号,01表示上(正)溢出,10表示下(负)溢出。

那么采用双符号位判断上述的问题如下:

问题:x=0.1101 y=-0.0111 ,用补码求x+y , x-y  (用双符号位表示)
答:
x[补] = 00.1101 , y[补] = 11.1001 , -y[补] = 00.0111   //00正号 11负号
x+y = 100.0110 mod 2^(4+2) = 00.0110 //这里00表示正数,无溢出
x-y = 01.0100 mod 2^(4+2) = 01.0100 //01表示上溢出

逻辑、算术移位

逻辑移:数据整体左移一位,最高位D15移除至DF最低位补0,示例:01101110 ----移位--> 11011100

算术移:数据整体左移一位,最高位D15移除至DF最低位补0,和逻辑移位的区别是算术理解为乘2,示例:01101110 ----移位--> 11011100

逻辑移:数据整体右移一位,最高位D1移除最高位D15处补0,示例: 11101110 ----移位--> 01110111

算术移:数据整体右移一位,最高位D15复制至右移的后D15处,最低位D1移除和逻辑移位的区别是D15处不是补0而是复制原来的D15,示例:11101110 ----移位--> 11110111

浮点数运算

做浮点运算时阶码和尾数用补码、双符号位表示以便于判断溢出

运算步骤:

  1. 将小阶向大阶对齐。移动

运算公式:设 x = 2Ex * Mx ,y = 2Ey * My 。则 x + y = (2Ex-Ey * Mx + My ) * 2Ey

暂停!!!!学习 博客视频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值