【计算机组成与设计:硬件/软件接口】第三章:计算机的算术运算

标签(空格分隔):【计算机组成与设计:硬件/软件接口】


第三章:计算机的算术运算

  • 第三章:计算机的算术运算

    • 3.1 引言
    • 3.2 加法和减法
    • 3.3乘法
      • 3.3.1 顺序的乘法算法和硬件
      • 3.3.2 有符号乘法
      • 3.3.3 更快的乘法
      • 3.3.4 MIPS中的乘法
      • 3.3.5 小结
    • 3.4 除法
      • 3.4.1 除法算法及其硬件结构
    • 3.5 浮点运算
      • 3.5.1 浮点表示
      • 3.5.2 浮点加法
      • 3.5.3 浮点乘法
    • 我的微信公众号

3.1 引言

3.2 加法和减法

  • 对于二进制补码,什么时候发生溢出?
    硬件规模总是有一定限制的,例如字宽只有32位。当运算超过这个限制,就会发生溢出。
    首先看什么时候不会溢出。加法:当相加的两个源操作数符号相异时,不会发生溢出,因为二者的和必定不会大于其中的某一个操作数。若源操作数可以用32位表示,那么这个结果也必然可以用32位表示。减法规则相反,当源操作数符号相同时,不会溢出。例如 c - a可以视为 c + (-a),此时与加法不会溢出时情况相同。
    何时发生溢出?当加法和减法之后的结果需要使用多余32位表示时会发生溢出。例如,如果两个正数相加但结果是负数,或者一个负数减去一个正数结果为正数,那么必然发生了溢出。
    加减法发生溢出的条件:
  • 对于无符号整数,由于无符号整数通常用于表示内存地址,这种情况下的溢出可以忽略。

  • MIPS 解决溢出的方法:

    1. add,addi,sub,这三条指令在溢出时产生异常。
    2. addu,addiu,subu,这三条指令在溢出时不会发生一场。
      由于C语言忽略溢出,因此 MIPS C编译器总是采用无符号算术指令addu,addiu,subu,而不必考虑变量的类型。
  • 算术逻辑单元(arithmetic logic unit,ALU):用来执行加法、减法,通常也包括逻辑与、逻辑或等逻辑操作。

  • 异常:也叫中断,一种打断正常程序执行过程的事件,用于溢出检测。
  • 中断:来自处理器外部的异常。
  • 从本质上来说,异常或终端是一种打断正常过程的系统调用,产生溢出的指令地址保存在一个寄存器中,而后计算机会跳转到一个预先设定好的地址取执行相应的异常处理程序。保存异常地址的目的是为了在某些条件下能够在异常处理程序执行完毕之后返回源程序继续执行。
  • 饱和(saturating)操作是通用微处理器中一个出场出现的特性,它意味着当计算结果溢出时,结果被设置为最大的整数或者最小的负数,而不像二进制补码运算那样采用取模操作来获得结果。注意,饱和操作更适合多媒体操作。

3.3乘法

  • 乘法操作中,被乘数(multiplicand):第一个源操作数,乘数(multiplier):第二个源操作数,积(product):最终结果。一般而言,积的位数远远大于被乘数和乘数。事实上,在忽略符号位的情况下,积的位数等于乘数的位数与被乘数的位数。因此,乘数也需要考虑溢出的情况。

3.3.1 顺序的乘法算法和硬件

  • 假设源操作数仅仅是正数。下图给出了硬件结构。

    对于操作数的每一位的三个基本执行步骤:乘数的最低为(乘数的第0 位)决定了成功倍数是否被加到积寄存器上。第二步中的左移起着将被乘数左移的作用。第三部钟后的有一给出了下一个迭代中要使用的乘数位。这三个步骤重复执行32次才获得积。假设每个步骤花费一个时钟周期,那么100个时钟周期才可以完成两个32位数的相乘。

    以上算法很容易得到优化:当乘数位为1时,将乘数和被乘数进行移位,同时将被乘数和积相加。这样一来每一步只需要一个时钟周期。

3.3.2 有符号乘法

  • 如何处理有符号乘法,最简单的方法是首先将被乘数和乘数转换为整数,并记录原先的符号位。

3.3.3 更快的乘法

  • 思想:在乘法运算开始的时候通过检查乘数的32位,来判定被乘数是否被加上,快速的乘法运算的主要思想是为乘数的每一位提供一个32位加法器,一个用来输入被乘数和一乘数位相与的结果,另一个是上一个加法器的输出。
  • 方法:

3.3.4 MIPS中的乘法

  • 一对单独的32位寄存器来容纳64位的积,分贝是Hi和Lo。
  • 为了产生正确的有符号积和无符号积,MIPS提供了两条指令:mult 和 multu.
  • 为了取得32位的整数积,通常使用mflo指令。

3.3.5 小结

  • 乘法运算指示简单的移位和加法。

3.4 除法

  • 在除法的操作中,两个源操作数被称为被除数(dividend)和除数(divisor),结果为 商(quotient),第二个结果为 余数(remainder).它们之间的关系可以表示为

    被除数=商∗除数+余数被除数=商∗除数+余数

    被除数 = 商 * 除数 + 余数 其中余数小于除数。

3.4.1 除法算法及其硬件结构

  • 开始时,32位的商寄存器设为 0,算法每次的迭代将除数向右移一位,所以开始时将除数放置在64为除数寄存器的左半边,然后每次右移一位来和被除数对齐。玉树寄存器初始化为被除数。

3.5 浮点运算

    1. 科学记数法(scientific notation):十进制小数点左边只有一位整数的计数法。
    2. 规格化数(normalized):没有前导零的浮点计数法。
    3. 浮点数(floating point):二进制小数点不固定的表达数的计数法。
  • 对实数采用规格化形式的标准科学技术法的三个优点:1. 简化了浮点数的数据交换,2. 简化了浮点算术算法,3. 提高了可一个字存储的数的精度。

3.5.1 浮点表示

  • 尾数(fraction):位于浮点数和尾数字段,其值在 0 和 1 之间。
  • 指数(exponent):位于浮点数的指数字段,表示小数点的位置。
  • 考虑到字的大小是固定的,浮点表示的设计者必须在尾数位宽和指数位宽之间找出折中的办法。浮点数通常是多个字的宽度,MIPS中,s为浮点数的符号(1表示负数),指数域为8位宽(包括指数的符号位),尾数域为23位宽,这种表示成为符号和数值(sign and magnitude), 因为符号和数值的位置是相互分离的。

    一般浮点数的表示形式:

    (−1)S∗F∗2E(−1)S∗F∗2E

    (-1)^S*F*2^E 其中F为小数域的值,E为指数域的值。
    浮点表示法使得MIPS计算机有很大的数值表示范围,小到 2.010∗10−382.010∗10−38 2.0_{10} * 10^{-38},大到 2.010∗10382.010∗10382.0_{10} * 10^{38},但请注意,它和无穷是不同的。也会存在一些数字因为太大而不能表示。溢出依旧会发生。

  • 上溢(overflow):正的指数太大而导致指数域放不下的情况。
  • 下溢(underflow)):负的指数太大而导致指数域放不下的情况。
  • 一种减少上溢和下溢的方法:采用更达的指数格式。C语言中成为double,基于double的操作成为双精度(double precision)浮点算术,指的是浮点数由两个32位的字表示。单精度(single precision)浮点就是前面的格式,指的是浮点数由一个32位的字表示。

  • IEEE 754 浮点标准:
    双精度浮点数占用了两个MIPS字,如下所示。其中,s表示符号,指数域为11位,尾数与为52位。

    MIPS双精度的表示范围小到 2.010∗10−3082.010∗10−308 2.0_{10} * 10^{-308},大到 2.010∗103082.010∗103082.0_{10} * 10^{308}.它的主要的优势还是通过提供更多的有效位数来实现更达的表示精度。
    包括前面单精度浮点数,也是IEEE 754 浮点标准的一部分。

  • 为了将更多的数据为打包到有效位数(significand)部分,IEEE 754 标注甚至隐藏了规格化二进制数的前导位 1 .
    因此,在单精度浮点数下,数有24位宽(隐含的规格化二进制数的前导位1和23位尾数);在双精度的情况下,数有523位宽(1+52)。为了精确,我们用术语有效位数来表示24位或者53位的数,就是隐含1加上位数。
    因为 0 没有前导位 1 ,它的指数保留为0,所以硬件就不会将前导位1 加到尾数上。其余的数使用前面的形式

    (−1)S∗(1+F)∗2E(−1)S∗(1+F)∗2E

    (-1)^S*(1+F)*2^E 其中F为 0 和 1 之间的数。
    准确而言是

    (−1)S∗(1+(s1∗2−1)+(s2∗2−2)+...)∗2E(−1)S∗(1+(s1∗2−1)+(s2∗2−2)+...)∗2E

    (-1)^S*(1+ (s1 * 2^{-1}) + (s2 * 2^{-2}) + ...)*2^E

    其中,无穷用来处理 除0中断;非数字用来推迟程序中的一些测试和决定。

  • 为什么符号位放在最前面?因为 IEEE 754的设计者希望浮点能够比较快速地处理整数比较。
  • 为什么将指数放在有效位数前?因为这样可以简化用整数比较指令来处理地浮点数分类,有着相同符号的情况下,指数越大数值越大。

  • 带偏阶的计数法(biased notation):在IEEE 754中单精度的偏阶为 127,双精度的指数偏阶为 1023。带上偏阶之后,浮点数的表示为:

    (−1)S∗(1+F)∗2 (Exponent−Bias)(−1)S∗(1+F)∗2(Exponent−Bias)

    (-1)^S*(1+F)*2^{~(Exponent - Bias)}

3.5.2 浮点加法

  • 为了说明浮点加法的问题,我们将两个采用科学记数法的数字相加:9.99910∗101+1.61010∗10−19.99910∗101+1.61010∗10−19.999_{10} * 10 ^1 + 1.610 _{10}*10^{-1},假设我们只能存储 4 个十进制有效数字和两个十进制指数。
    步骤:

    1. 为了能让两个数字相加,我们必须将有较小指数的数指向有较大指数的数字。
      即 1.61010∗10−1=0.0161010∗1011.61010∗10−1=0.0161010∗1011.610_{10} * 10^{-1} = 0.01610_{10} * 10 ^1,由于只能表示4 位十进制数,所以需要移位,最终结果为 0.01610∗1010.01610∗101 0.016_{10} * 10 ^1.
    2. 将有效数相加:9.99910+0.01610=10.015109.99910+0.01610=10.01510 9.999_{10} + 0.016_{10} = 10.015_{10} .
    3. 因为和不是规格化科学记数形式,因此需要规格化,即 1.001510∗1021.001510∗102 1.0015_{10} * 10^2.
    4. 由于有效数只有 4位十进制数那么长(不包括符号位),所以我们需要进行舍入,依照四舍五入法则,有1.00210∗1021.00210∗102 1.002_{10} * 10^2
  • 浮点加的基本结构:

3.5.3 浮点乘法

我的微信公众号

【计算机组成与设计:硬件/软件接口】第三章:计算机的算术运算相关推荐

  1. 计算机组成与设计硬件/软件接口 (MIPS版)

    买了一本<计算机组成与设计硬件/软件接口(MIPS版)>,非科班出身的我,从事计算机行业已经8年了,却对计算机的基础什么也不专业.有点惭愧,因为对时间的流逝而感到遗憾!行了,但有言说,多无 ...

  2. 计算机组成与设计 硬件/软件接口 Risc-v 版

    第一章 计算机抽象及相关技术 1.1 引言 1.1.1 传统的计算机应用分类及其特点 个人计算机(Personal Computer, PC) 通用,各种软件;受成本.性能权衡 服务器(Sever C ...

  3. 【计算机组成与设计 硬件/软件接口-2】MIPS指令集架构

    指令:计算机的语言 引言 所谓指令集,指的就是计算机的全部指令,这章节将以MIPS指令集作为学习对象,如果是x86指令集,还请参考<深入理解计算机系统>.MIPS指令集在嵌入式芯片市场占有 ...

  4. 计算机硬件和软件英语,计算机组成与设计:硬件/软件接口(英文版 原书第5版 ARM版)...

    本书采用ARMv8-A体系结构, 介绍当前硬件技术的基本原理.汇编语言.计算机算术.流水线.内存层次结构和I/O.本书更加关注后PC时代发生的变革,通过实例.练习等详细介绍*新涌现的移动计算和云计算, ...

  5. 计算机组成与设计英文版在线,计算机组成与设计(硬件软件接口英文版原书第5版RISC-V版)/经典原版书库...

    目录 CHAPTERS 1 Computer Abstractions and Technology 1.1 Introduction 1.2 Eight Great Ideas in Compute ...

  6. 计算机中的表示方法,计算机应用基础第三章计算机中信息的表示方法

    <计算机应用基础第三章计算机中信息的表示方法>由会员分享,可在线阅读,更多相关<计算机应用基础第三章计算机中信息的表示方法(17页珍藏版)>请在人人文库网上搜索. 1.第第三三 ...

  7. 计算机是怎样跑起来在线看,第三章 计算机是怎样跑起来的

    1.计算机的三个根本性基础(三大原则) [1]计算机是执行输入.运算.输出的机器 - 从硬件上来看,可以说计算机是执行输入.运算.输出三种操作的机器. - 计算机的硬件由大量的IC组成. - 每块IC ...

  8. 【计算机组成与设计:软件、硬件接口(1)】计算机概要与技术

    文章目录 一:引言 二:8个伟大思想 三: 程序概念入门 四:硬件概念入门 五: 处理器和存储器 六:性能 七:功耗 八:单处理器→多处理器 九:Intel Core i7实例 十:谬误与陷阱 十一: ...

  9. 硬件软件接口 (RISC-V) Chapter 2

    计算机组成与设计-硬件软件接口 Chapter2 指令集 RISC-V简介 RISC-V基本语法 计算机硬件的操作数 指令格式 逻辑运算 32个寄存器 指令集 The words of a compu ...

  10. 图书推荐|计算机组成与设计(原书第5版) 硬件软件接口 RISC-V

    计算机组成与设计(原书第5版)  硬件软件接口 RISC-V 这本书是引进过来的,本系列图书广受盛誉,有两位"图灵奖"得主撰写,书的权威性及细致性不言而喻,两位作者的履历也是让我们 ...

最新文章

  1. OpenCV+python:霍夫变换与直线检测
  2. 我的简书两月记:数据可视化
  3. Hadoop多用户作业调度器和安全机制的自我总结
  4. java批量导入数据到excel
  5. Activiti 简易教程
  6. 昨夜洪峰抵达主城,重庆人是这么过的......
  7. Access control allow origin 简单请求和复杂请求
  8. windows 游戏编程 一windows 编程
  9. virtuoso配合calibre进行电路后仿真
  10. 微信小程序-组件属性传值
  11. 视觉SLAM和激光SLAM的实现
  12. RabbitMQ 使用规范
  13. stm32上云实战篇
  14. 搜索引擎-应用篇(地理位置查询)
  15. 学习新手给Android新手的一些学习建议
  16. 【工业大数据】大数据时代,计量服务将何去何从?
  17. 简单利用路由黑洞解决DDOS流量攻击
  18. B.FRIENDit:键盘轴体零死角剖析,挑选机械式键盘不必烦恼!
  19. IOS cocoapods镜像源更新
  20. IDEA添加maven依赖方法

热门文章

  1. ISO 17799 /27001标准简介
  2. 大数据时代下的用户洞察:用户画像建立(ppt版)
  3. 浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决
  4. Iar新建工程配置使用教程
  5. 解决vmrc的连接已断开,正在尝试重新连接
  6. mac的java代码生成器为什么文件路径是这样的
  7. 动态贝叶斯网络DBN
  8. java俄罗斯方块简单代码_Java简易俄罗斯方块
  9. “杜绝电子垃圾,我们需要软件永远更新下去!”
  10. 疯狂的程序员_《戴蓓会客厅》第13期|疯狂的程序员 三维家蔡志森的野心