计算机组成原理课堂笔记(六)I/O系统、计算机运算方法


输入输出系统

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的这种占有成为周期窃取/周期挪用(一般挪用一个存取周期)


计算机的运算方法

原码表示法

对于整数

  1. 一位符号位(0为+,1为-),其余位为数值位
  2. 用逗号“,”将符号位和数值位分隔开





对于小数

  1. 一位符号位(0为+,1为-),其余位为数值位
  2. 用逗号“ . ”将符号位和数值位分隔开

例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 $$

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 计算机组成原理课堂笔记(六)I/O系统、计算机运算方法


Make Everyday Count