输入输出系统
I/O设备与主机信息传送的控制方式
程序查询方式
CPU和I/O串行工作
CPU不断查询I/O是否已做好准备,,从而控制I/O设备与主机交换信息。
即I/O工作时CPU踏步等待,
程序中断方式
CPU和I/O并行工作
CPU在启动I/O设备后,不查询设备是否已准备就绪,继续执行原来的程序,只是当I/O设备准备就绪并向CPU发出中断请求后才给予响应。
DMA方式
主存与I/O设备之间有一条数据通道,主存与I/O设备交换信息的时,无需调用中断程序服务程序。若是出现DMA与CPU同时访问主存,CPU总是将总线的占有权让给DMA,通常将 DMA的这种占有成为周期窃取/周期挪用(一般挪用一个存取周期)
计算机的运算方法
原码表示法
对于整数
对于小数
- 一位符号位(0为+,1为-),其余位为数值位
- 用逗号“ . ”将符号位和数值位分隔开
例1:已知$[x]_原=1.0011$,求$x$
分析:符号位为1,所以是负数;小数点分隔,所以是小数。
$$ x=-0.0011 $$
例2:已知$[x]_原=1,1100$,求$x$
分析:符号位为1,所以是负数;逗号分隔,所以是整数。
$$ x=-1100 $$
例3:已知$[x]_原=0.1101$,求$x$
分析:符号位为0,所以是正数;小数点分隔,所以是小数。
$$ x=+0.1101 $$
例4:求$x=0$的原码

原码运算出现了问题
x=0的原码,会有多种表示法,即$[+0]_原≠[-0]_原$
另外,原码做加法会出现的问题
要求 | 数1 | 数2 | 实际操作 | 结果符号 |
---|---|---|---|---|
加法 | 正 | 正 | 加 | 正 |
加法 | 正 | 负 | 减 | 可正可负 |
加法 | 负 | 正 | 减 | 可正可负 |
加法 | 负 | 负 | 加 | 负 |
实际操作既包括加法,又包括减法
改进方向:希望找到一个与负数等价的正数来代替这个负数,使得:减→加。由此引入补码的概念。
补码表示法
- 一个负数加上 “模” 即得该负数的补数
- 一个正数和一个负数互为补数时,它们绝对值之和即为模数
补码的快捷求法
正数的补码就是其原码
eg1:$x=+1010$,$[x]_补=0,1010$
eg2:$x=+0.1110$,$[x]_补=0.1110$
负数补码:相对于原码,符号位保持不变,数值位按位取反,末位+1
eg1:$x=-1011000$ → $x_原=1,1011000$ → $x_补=1,0101000$
eg2:$x=-0.1100000$ → $x_原=1.0011111$ → $x_补=1.0100000$
用补码反推$x$
- 判断正负,若为正数,直接写出来
若为负数:
- 符号位不变
- 数值位先-1再取反
eg1:已知$[x]_补=0.0001$。求$x$
由定义得:$x=+0.0001$
eg2:已知$[x]_补=1.0001$。求$x$
$$ [x]_补=1.0001 $$
$$ [x]_原=1.1111 $$
$$ ∴x=-0.1111 $$
练习

反码表示法
- 正数的反码:就是其原码。
- 负数的反码:在其原码的基础上, 符号位不变,数值位取反。
eg1,正整数:$x=+1101$,$[x]_原=0,1101$,$[x]_反=0,1101$
eg2,负整数:$x=-1101$,$[x]_原=1,1101$,$[x]_反=1,0010$
eg3,正小数:$x=+0.1101$,$[x]_原=0.1101$,$[x]_反=0.1101$
eg4,负小数:$x=-0.1010$,$[x]_原=1.1010$,$[x]_反=1.0101$
由反码推$x$
例:

例:

移码表示法
提出的原因:补码表示很难直接比较两个数的真值大小
想法:通过调整最高位,来方便的比较不同二进制数的大小
做法:原码有$n$位,则$±2^{n-1}$
移码和补码的比较:

正数的补码最前面是0,移码最前面是1;
负数的补码最前面是1,移码最前面是0;
这样可以方便的表示每个数的大小
浮点表示
浮点数的一般形式:
$$ N=S\times r^j $$
其中$S$为尾数,$j$为阶码,$r$为基数
计算机中$r$通常取2。
当$r=2$时,$N=11.0101 = 0.110101 \times 2^{10}$ 其中幂10是二进制。
例:

解:
∵$2^{14}=16284$, $2^{15}=32768$,∴至少阶码至少为十进制的15,即阶码$j=1111$,即:
$$ m≥4 $$
$$ $n=24-1(阶符)-1(尾数)-m(阶码位数)≤18$ $$
因为要保证数的最大精度,所以尾数尽可能多,取阶码位数$m=4$,尾数位数$n=18$。
浮点的规格化形式
$r=2$时,要求尾数的最高位为1(其实就是科学计数法的那种表示方法)
$r=2$左规:尾数左移1位,阶码-1
$r=2$右规:尾数右移1位,阶码+1
注:“左移”是指数值左移,不是中学数学里讲的小数点左移。
基数$r$越大,可表示的浮点数范围越大,但浮点数的精度也越低。
例题1

解:
$$ x=+\frac{19}{128}=+\frac{1}{8}+\frac{1}{64}+\frac{1}{128} $$
所以$x$的二进制形式:
$$ x = 0.0010011 $$
由于数值部分取10位,所以定点表示需要补0:
$$ x = 0.0010011000 $$
浮点规格化形式:(阶数是-10,因为小数点右移了2位)
$$ x = 0.1001100000\times2^{-10} $$
定点机中,基数为2,高位只能为1:
$$ [x]_原=[x]_补=[x]_反=0.0010011000 $$
浮点机中:
$$ [x]_原=1,0010;0.1001100000 $$
$$ [x]_反=1,1101;0.1001100000 $$
$$ [x]_补=1,1110;0.1001100000 $$
例题2

解:
设$x=-58$
二进制形式:
$$ x=-111010 $$
定点表示:
$$ x=-0000111010 $$
浮点规格化形式:(阶数是110是因为数值右移了6位)
$$ x=-(0.1110100000)\times2^{110} $$
定点机中:
$$ [x]_原=1,0000111010 $$
$$ [x]_补=1,1111000110 $$
$$ [x]_反=1,1111000101 $$
浮点机中:
$$ [x]_原 = 0, 0110; 1. 1110100000 $$
$$ [x]_补 = 0, 0110; 1. 0001100000 $$
$$ [x]_反 = 0, 0110; 1. 0001011111 $$
按照题意:阶码为移码,尾数为补码的形式
$$ [x]_{阶移、尾补} = 1, 0110; 1. 0001100000 $$
定点运算
移位运算
计算机中,认为小数点不动,数字相对小数点移动
左移 → 绝对值扩大
右移 → 绝对值缩小
算术移位规则
例

原码:

补码:
注意补码的移位规则:左移右侧补0,右移左侧补1

反码:

加减法运算
流程:两个数写成补码,进行加/减,算出的补码结果再转换为原数。
运算公式:
(1)加法

(2)减法

注意:
- 数值位的进位可以进到符号位上,因为数值加减会影响符号
- 符号位产生的进位自然丢掉
例1:

例2:

例3:

溢出判断
例4:

解:
$$ A_原=1,1100001 $$
$$ A_补=1,0011111 $$
$$ B_原=1,0101001 $$
$$ -B_补=1,1010111 $$
$$ A_补+(-B_补)=(A_B)_补=0,1110110 $$
$$ (A-B)_原=0,1110110 $$
转换得
$$ A=B=+118 $$
结果溢出,答案错误
溢出判断:
参加操作的两个数符号相同,其结果的符号与原操作数的符号不同,即为溢出。
(1)单符号位判断
最高有效位的进位$\bigoplus$符号位的进位 = 1,则溢出

(2)双符号位判断
即假设原符号位后还有一位,能接住符号位的进位。

其实这两种判断方法的原理是一个意思
对于例4:
①单符号位判断:
符号位进位为1,即
$$ C_s=1 $$
最高数值位进位为0,即
$$ C_1=0 $$
∴$C_s \bigoplus C_1=1$
∴有溢出
②双符号位判断:
$$ (A-B)_补=\underline{10},1110110 $$
双符号位不同
∴有溢出
修正:
$$ A-B=+118-2^8=-138 $$
Comments | NOTHING