计算机组成原理之运算方法和运算器

数据信息的表示

  • 数值数据
  • 非数值数据

数值数据的表示

计算机采用二进制原因

  • 易于物理实现
  • 运算规则简单
  • 机器可靠性高
  • 逻辑判断方便

进位计数制

指计算机采用从低位向高位进位的方式计数

补码

其实就是利用同余系把数映射到[0,2^n)范围进行运算

移码

常用于表示浮点数的阶码,当偏移量取2 n − 1 2^{n-1}2n1,其真值对应的移码定义是为[ X ] 移 = 2 n − 1 + X [X]_移=2^{n-1}+X[X]=2n1+X。即把补码的符号位取反。

定点数与浮点数

  • 定点数:小数点位置固定,数据范围有限,硬件简单。
  • 浮点数:小数点位置浮动,数据范围很大,硬件复杂。

IEEE标准中,三元组{S,E,M}来表示一个数,尾数M的最高有效位总为1,所表示实际值为1.M。

阶码表示指数的操作:避免出现正负指数,还可以保持数据的原有大小数据,便于进行比较。

例:

在这里插入图片描述
在这里插入图片描述

非数值数据的表示

字符与字符串的表示

  • ASCII字符
  • Unicode码
  • 字符串

汉字的编码方法

  • 输入码
  • 交换码
  • 机内码
  • 字形输出码与汉字库

数据信息的校验

奇偶校验

  • 可以检测出一位或奇数位错误,但不能确定出错的位置,也不能检测出偶数位错误。(一位出错的概率比多位出错的概率高得多)

简单奇偶校验

  • 方式为在原信息中加上一位校验位组成校验码,这个校验位的作用是使得原有效信息中,“1”的个数为奇数个。
  • 以奇校验为例,形成方式为原信息串求异或和后取反。
  • 校验检测时,信息位和校验位异或和为0则代码无错误。但出现错误时,无法确定位置。

例题

在这里插入图片描述

交叉奇偶校验

  • 纵向、横向同时校验

  • 大量的数据块传送时,不仅在每个字节内部横向校验,并且全部字节同一位也设置奇偶检验做纵向校验。

定点运算和定点运算器

基本运算

  • 算术运算
  • 逻辑运算

定点加、减法运算

补码加法公式——[ x ] 补 + [ y ] 补 = [ x + y ] 补 ( m o d 2 ) [x]_补+[y]_补=[x+y]_补(mod2)[x]+[y]=[x+y](mod2)

减法本质上仍然是加法,对减数取相反数即可

溢出判断

  • 双符号位中,两数进行操作后两个符号位一致则没有发生溢出否则溢出(01正溢,10负溢)
  • 无论是否溢出,双符号位的最高位始终指示正确的符号
  • 两个符号位异或0则正常

定点乘、除法运算

  • 实现角度分为三种方式
    • 软件实现(基本运算指令,循环子程序,硬件简单,但是速度慢)
    • 硬件实现(逻辑电路实现,增加专门乘除法指令,比第一种快)
    • 并行乘除法器(流水式阵列乘除法器,有专门乘除法指令,速度最快)
  • 编码角度,原码实现也比较简单,但现代计算机还是采用补码

逻辑运算

NOT、AND、OR、XOR

定点运算器的组成

运算器主要功能是对数据进行加工处理,包括算术和逻辑运算

算术逻辑单元(ALU)、寄存器、数据总线和其他逻辑部件组成

ALU

支持算术、逻辑运算,是运算器核心

任何计算机都可以通过编程来执行任何算术运算(软件层面)

数据总线

完成运算器内部的数据传送。

  • 内部总线是CPU内各部件的连线。

  • 外部总线是系统总线,即CPU与存储器、I/O系统之间的连线。

可以分为单向传送总线和双向传送总线

运算器的基本结构形式

  • 单总线结构的运算器

    • 所有部件都连接到同一条总线上
    • 运算器内部只有一组数据总线,同一时间只能有一个操作数放到总线
  • 双总线结构的运算器

    • 有两条总线同时连接ALU的两个输入端
    • 两个操作数同时加到ALU进行运算
  • 三总线结构的运算器

    • 共有三条总线,速度最快
    • 每条总线单向传输数据,给寄存器数据传送带来困难,设置了总线旁路器

寄存器

  • 一般指通用寄存器(用途广泛)
  • 专用寄存器
  • 累加器直接与ALU相连,使用频繁

浮点运算和浮点运算器

浮点规格化重要性

  • 使浮点数保留最多的有效数字
  • 使数据具有唯一的表示形式

浮点数的加、减法运算

浮点数加、减法运算规则

x + y = 2 E x ∗ M x + 2 E y ∗ M y = { ( M x ∗ 2 E x − E y + M y ) ∗ 2 E y   ( E x ≤ E y ) ( M x + M y ∗ 2 E y − E x ) ∗ 2 E y   ( E x > E y ) x+y=2^{E_x}*M_x+2^{E_y}*M_y=\left\{ \begin{aligned} (M_x*2^{E_x-E_y}+M_y)*2^{E_y} & & \ (E_x \leq E_y) \\ (M_x+M_y*2^{E_y-E_x})*2^{E_y} & & \ (E_x > E_y) \end{aligned} \right.x+y=2ExMx+2EyMy={(Mx2ExEy+My)2Ey(Mx+My2EyEx)2Ey (ExEy) (Ex>Ey)

  • 0操作数检查

    有一个为0则省去后续操作

  • 对阶

    即对其小数点,阶码相同则对齐,否则小阶靠近大阶,尾数相应右移

  • 尾数相加

  • 结果规格化

    结果符号位不等则尾数绝对值大于1,尾数右移1位,阶码加1

    结果符号位相等则向左规格化,尾数左移n位,阶码减n

  • 舍入处理

    丢失尾数0舍1入(尾数+1)

    也可以尾数恒置1(数据丢失),速度快,不积累误差

  • 溢出处理

    • 尾数溢出即结果的规格化,没有真正的溢出

    • 阶码溢出,下溢当作0,上溢当作+inf或者-inf,上溢是真溢出

样例1:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

样例2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

浮点数的乘、除法运算

浮点数的乘除法可以直接进行阶码、尾数的操作,不需要进行讨论。

分为如下几个步骤

  • 0操作数检查
  • 阶码加/减操作
  • 尾数乘/除操作
  • 规格化处理与舍入

浮点运算流水线

流水线原理

按传统方式,所有指令均为顺序执行,指令控制器和运算器交替运算,有资源浪费。一种合理解决方案是流水线式工作,不同元件负责不同部分的工作。划分子任务并发执行。

浮点运算器实例

CPU之外的浮点运算器:8087运算器,配合8086CPU进行,称为协处理器,以异步方式与8086并行工作。

CPU之内的浮点运算器:奔腾CPU将浮点运算器包含在芯片内,流水线设计。内部主要流水线是**“U-Pipe”,另一条是"V-Pipe"**。


版权声明:本文为hzerotole原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。