• 沒有找到結果。

计算机组成与嵌入式系统 (原书第6版)

N/A
N/A
Protected

Academic year: 2022

Share "计算机组成与嵌入式系统 (原书第6版)"

Copied!
100
0
0

加載中.... (立即查看全文)

全文

(1)
(2)
(3)

计算机组成与嵌入式系统

(原书第 6 版)

Computer Organization and Embedded Systems, Sixth Edition

(加) Carl Hamacher Zvonko Vranesic 女皇大学

多伦多大学 Safwat Zaky 多伦多大学 Naraig Manjikian

女皇大学 著

王国华 等译

(4)

械工业出版社,2013.8

(计算机科学丛书)

书名原文:Computer Organization and Embedded Systems, Sixth Edition ISBN 978-7-111-43865-6

. 计… Ⅱ. ①哈… ②王… Ⅲ. ①计算机组成原理 ②微型计算机 – 系统设计 Ⅳ. ① TP301 ② TP360.21 中国版本图书馆CIP 数据核字(2013)第 207203 号

版权所有·侵权必究 封底无防伪标均为盗版

本书法律顾问 北京市展达律师事务所 本书版权登记号:图字:01-2011-2302

Carl Hamacher, Zvonko Vranesic, Safwat Zaky, and Naraig Manjikian: Computer Organization and Embedded Systems, Sixth Edition (978-0-07-338065-0).

Copyright © 2012 by McGraw-Hill Education.

All rights reserved. No part of this publication may be reproduced or transmitted in any form or by any means, electronic or mechanical, including without limitation photocopying, recording, taping, or any database, information or retrieval system, without the prior written permission of the publisher.

This authorized Chinese translation edition is jointly published by McGraw-Hill Education (Asia) and China Machine Press.This edition is authorized for sale in the People’s Republic of China only, excluding Hong Kong, Macao SAR and Taiwan.

Copyright © 2013 by The McGraw-Hill Asia Holdings (Singapore) PTE.LTD and China Machine Press.

版权所有。未经出版人事先书面许可,对本出版物的任何部分不得以任何方式或途径复制或传播,包 括但不限于复印、录制、录音,或通过任何数据库、信息或可检索的系统。

本授权中文简体字翻译版由麦格劳-希尔(亚洲)教育出版公司和机械工业出版社合作出版。此版本 经授权仅限在中华人民共和国境内(不包括香港特别行政区、澳门特别行政区和台湾)销售。

版权© 2013 由麦格劳-希尔(亚洲)教育出版公司与机械工业出版社所有。

本书封面贴有McGraw-Hill Education 公司防伪标签,无标签者不得销售。

本书是计算机组成的入门级教程,全面地介绍了计算机组成结构、操作、性能的基本概念,还介绍了 有关外围设备、处理器系列模型以及嵌入式系统的一些主要内容。书中知识具有很强的实用性,并涵盖了 当今许多先进的技术和设计思想。

本书特别适合作为电子和计算机专业的本科生关于计算机组成与嵌入式系统方面的入门教材。

机械工业出版社(北京市西城区百万庄大街22 号  邮政编码 100037)

责任编辑:姚 蕾  迟振春 印刷 2013 年 10 月第 1 版第 1 次印刷 185mm×260mm • 30.5 印张 标准书号:ISBN 978-7-111-43865-6 定  价:79.00 元

凡购本书,如有缺页、倒页、脱页,由本社发行部调换

客服热线: (010) 88378991 88361066 投稿热线: (010) 88379604 购书热线: (010) 68326294 88379649 68995259 读者信箱:[email protected]

(5)

文艺复兴以降,源远流长的科学精神和逐步形成的学术规范,使西方国家在自然科学的 各个领域取得了垄断性的优势;也正是这样的传统,使美国在信息技术发展的六十多年间名家 辈出、独领风骚。在商业化的进程中,美国的产业界与教育界越来越紧密地结合,计算机学科 中的许多泰山北斗同时身处科研和教学的最前线,由此而产生的经典科学著作,不仅擘划了研 究的范畴,还揭示了学术的源变,既遵循学术规范,又自有学者个性,其价值并不会因年月的 流逝而减退。

近年,在全球信息化大潮的推动下,我国的计算机产业发展迅猛,对专业人才的需求日 益迫切。这对计算机教育界和出版界都既是机遇,也是挑战;而专业教材的建设在教育战略上 显得举足轻重。在我国信息技术发展时间较短的现状下,美国等发达国家在其计算机科学发展 的几十年间积淀和发展的经典教材仍有许多值得借鉴之处。因此,引进一批国外优秀计算机教 材将对我国计算机教育事业的发展起到积极的推动作用,也是与世界接轨、建设真正的世界一 流大学的必由之路。

机械工业出版社华章公司较早意识到“出版要为教育服务”。自1998 年开始,我们 就将工作重点放在了遴选、移译国外优秀教材上。经过多年的不懈努力,我们与Pearson,

McGraw-Hill,Elsevier,MIT,John Wiley & Sons,Cengage 等世界著名出版公司建立了良好的 合作关系, 从他们现有的数百种教材中甄选出 Andrew S. Tanenbaum,Bjarne Stroustrup,Brain W. Kernighan,Dennis Ritchie,Jim Gray,Afred V. Aho,John E. Hopcroft,Jeffrey D. Ullman,

Abraham Silberschatz,William Stallings,Donald E. Knuth,John L. Hennessy,Larry L. Peterson 等大师名家的一批经典作品,以“计算机科学丛书”为总称出版,供读者学习、研究及珍藏。

大理石纹理的封面,也正体现了这套丛书的品位和格调。

“计算机科学丛书”的出版工作得到了国内外学者的鼎力襄助,国内的专家不仅提供了中 肯的选题指导,还不辞劳苦地担任了翻译和审校的工作;而原书的作者也相当关注其作品在中 国的传播,有的还专程为其书的中译本作序。迄今,“计算机科学丛书”已经出版了近两百个 品种,这些书籍在读者中树立了良好的口碑,并被许多高校采用为正式教材和参考书籍。其影 印版“经典原版书库”作为姊妹篇也被越来越多实施双语教学的学校所采用。

权威的作者、经典的教材、一流的译者、严格的审校、精细的编辑,这些因素使我们的 图书有了质量的保证。随着计算机科学与技术专业学科建设的不断完善和教材改革的逐渐深 化,教育界对国外计算机教材的需求和应用都将步入一个新的阶段,我们的目标是尽善尽美,

而反馈的意见正是我们达到这一终极目标的重要帮助。华章公司欢迎老师和读者对我们的工作 提出建议或给予指正,我们的联系方法如下:

华章网站:www.hzbook.com 电子邮件:[email protected] 联系电话:(010)88379604

联系地址:北京市西城区百万庄南街1 号 邮政编码:100037

ࡺ「᪅㗞

华章科技图书出版中心

(6)

本书是作者结合其讲授课程时所积累的丰富经验编写而成的,是一本经典的电子工程及 计算机相关专业的本科教材。本书系统地介绍了现代计算机硬件系统的各个组成部分,包括 处理器、存储器、输入/ 输出和互连标准等,内容全面,知识结构合理,并从实践的角度出 发,通过使用流行的商用计算机实例来详细解释主要原理。同时,本书还涵盖了当今许多先 进的技术和设计思想,具有很强的实用性。

本书第6 版在内容和结构安排上都有很大的改动,包含了两章嵌入式系统的内容,并在 每一章的末尾增加了一节“问题解析”,给出了一些典型问题的解决方案。此外,采用RISC 方法介绍指令集体系结构的基本概念,并着重讨论RISC 风格的处理器设计及流水线实现。

最后,在附录中给出了4 种流行的商用处理器实例。

本书由王国华组织并翻译和校对,华洁、安迪、蔡颖星和朱林参与了大量的翻译工作,

参加本书翻译工作的还有严伟超、罗伟良、唐柯等。此外,华南理工大学软件学院的陈虎、

张杨、刘艳霞、黄小兵等老师对本书的翻译给予了大力的支持和帮助,在此对他(她)们的 贡献表示诚挚的感谢。

由于译者水平有限,书中难免存在错误和疏漏之处,敬请广大读者批评指正。

译者 2013 年 7 月

(7)

本书适用于电子工程、计算机工程、计算机科学专业有关计算机组成和嵌入式系统方面 的初级课程。本书的知识结构是相对独立的,假定读者已具备了计算机高级语言程序设计的基 本知识。由于多数学习计算机组成的学生都已经学习了数字逻辑电路这一入门课程,因此,

本书的主体内容没有包含这一部分知识,但是我们为有需要的读者提供了逻辑电路方面的详 尽附录。

本书融入了作者在教授电子与计算机工程、计算机科学以及工程科学专业的本科生时所 积累的丰富经验。我们总是从实践的角度进行计算机组成原理的教学,因此在形成本书内容时 的一个关键考虑是使用从商用计算机中提取的实例来详细解释主要原理。本书中主要的商业实 例来源于:Altera 的 Nios II、Freescale 的 ColdFire、ARM 以及 Intel 的 IA-32 体系结构。

读者必须清楚地认识到,数字系统的设计并不是应用最佳设计算法的简单过程。许多设 计决策取决于大量试探性的判断和经验。这包括在一系列选择方案中进行成本/ 性能、硬件 / 软件的权衡。我们的目标就是把这些思想传达给读者。

本书可以作为工程学或计算机科学专业一个学期的课程用书,也适用于软件和硬件方向 的学生。尽管本书侧重于硬件,我们仍阐述了大量有关软件方面的问题。

McGraw-Hill 建立了一个包含本书辅助材料的网站:http://www.mhhe.com/hamacher。

本书的内容

前3 章介绍了计算机的基本结构,在机器指令级执行的操作,以及程序员可见的输入 / 输 出方法。第4 章讲述了将汇编语言和高级语言编写的程序翻译成机器语言以及管理其执行过程 所需要的系统软件。后8 章讨论了包括嵌入式系统在内的现代计算机中硬件设备的组织结构、

互连和性能。

本书还提供了5 个详尽的附录。附录 A 涵盖了数字逻辑电路。其后的 4 个附录分别描 述了4 种流行的商业指令集体系结构——Altera 的 Nios II、Freescale 的 ColdFire、ARM 以及 Intel 的 IA-32。

第1 章对计算机硬件给出了总体描述,并对后续章节中将会深入讨论的术语进行了概括 性介绍。该章介绍了基本功能部件以及它们相互作用组成一个完整计算机系统的方法,讨论了 数和字符的表示以及基本的算术运算,还介绍了性能问题以及计算机的发展简史。

第2 章系统地介绍了机器指令、寻址技术和指令序列。该章使用通用的汇编语言表示 的机器指令级别的程序示例来讨论循环、子程序和堆栈等概念。在介绍这些概念时,使用了 RISC 风格的指令集体系结构,此外还包括了与 CISC 风格指令集的比较描述。

第3 章从程序员的角度介绍了基本的输入 / 输出技术。该章说明了如何使用轮询法进行程 序控制I/O,以及在 I/O 传输中如何使用中断。

第4 章介绍了系统软件。该章说明了编译器、汇编程序、连接程序和装载程序执行的任 务,描述了跟踪和显示程序执行结果的实用程序,也描述了管理用户程序的执行以及包括中断 处理在内的输入/ 输出操作的操作系统程序。

第5 章探讨了 RISC 风格处理器的设计。该章说明了提取和执行不同类型机器指令所需的

(8)

处理步骤序列,然后详细阐述了实现这些处理步骤所需的硬件组织,同时也考虑了CISC 风格 处理器的不同需求。

第6 章介绍了流水线和多个执行部件在高性能处理器设计中的使用。该章利用第 5 章中 描述的RISC 风格处理器设计的流水线版本来阐明流水线,探讨了编译器的作用以及流水线执 行与指令集设计之间的关系,还对超标量处理器进行了讨论。

第7 章探讨了输入 / 输出硬件。该章讨论了包括总线结构在内的互连网络,说明了同步和 异步操作,也介绍了包括USB 和 PCI Express 在内的互连标准。

第8 章讨论了半导体存储器,包括 SDRAM、Rambus 和闪存(Flash memory)的实现。

该章介绍了可增加存储器带宽的高速缓存(cache),从性能建模等细节上对其进行了讨论,还 介绍了虚拟存储器系统、存储器管理和快速地址转换技术,并将磁盘和光盘作为存储器层次结 构的一部分进行了讨论。

第9 章探讨了计算机中算术部件的实现。该章描述了对补码数进行定点加、减、乘、除 操作的硬件逻辑设计,解释了超前进位加法器和快速乘法器,并描述了Booth 乘数重编码和进 位保留加法技术,还介绍了IEEE 标准中浮点数的表示与操作。

今天,越来越多的处理器被用于嵌入式系统而不是通用计算机中。第10 章和第 11 章针对 嵌入式系统进行了讨论。首先,在第10 章中介绍了系统集成的基本内容、部件(component)

互连以及实时操作,还对微控制器的使用进行了讨论。然后,第11 章集中讨论片上系统

(SoC)的实现,其中单一的芯片上集成了满足特定应用需要的数据处理、存储器、I/O 和定时 器功能,并通过一个详尽的例子说明了如何在这样的环境中使用FPGA 和现代设计工具。

第12 章讨论了并行处理和性能。该章介绍了用于增强单处理器功能的硬件多线程和向 量处理,描述了共享存储器的多处理器以及高速缓存一致性的问题,还介绍了多处理器互连 网络。

附录A 详细介绍了数字逻辑电路知识,可供没有修过电路设计课程的读者参考。

附录B、C、D 和 E 说明了第 2 章和第 3 章中介绍的指令集概念在 4 种商用处理器 Nios II、ColdFire、ARM 以及 Intel IA-32 中的实现。Nios II 和 ARM 处理器说明了 RISC 的设计风格。

ColdFire 采用了相对容易理解的 CISC 设计,而 IA-32 的 CISC 体系结构代表了最成功的商业 设计。每个处理器的介绍都包括第2 章和第 3 章中的汇编语言例子在相应处理器中的实现。这 些附录中给出的细节对于理解本书的主体内容来说不是必需的,只涵盖其中一个附录就足以认 识商用处理器的指令集了。选择哪个处理器作为例子很可能受到实际实验室中设备的影响,教 师不妨使用多个处理器来说明不同的设计方法。

第 6版的变化

本书的第6 版对内容和结构安排作了重大改动,主要包括:

用RISC 方法介绍指令集体系结构的基本概念,接着对 RISC 方法与 CISC 方法进行了

比较。

处理器设计的讨论着重于RISC 风格体系结构的实现,从而自然地过渡到流水线操作的

介绍。

用两章介绍了嵌入式系统的内容 :一章介绍了嵌入式系统的基本结构和微控制器的使

用,另一章则探讨了片上系统的实现。

(9)

附录给出了4 种商用处理器的例子。每个附录包含了给定处理器指令集体系结构的基

本信息。

在每一章和附录的末尾增加了一个新的小节“问题解析”,给学生提供了一些典型问题

的预期解决方案。

习题的难度等级

每一章和附录末尾的习题分为以下几类 :简单(E)、中等(M)或偏难(D),这些分类 的解释如下:

简单——直接应用本书所介绍的具体信息便可以在几分钟内得到解决方案。

中等——通常不能直接按照本书所介绍例子中采用的方法来解决问题。在某些情况下,

解决方案可能是某个例子的一般情况,但比简单问题要花更长的时间。

偏难——解决这些问题需要一些额外的洞察力。如果一个解决方案需要编写程序,则

其底层的算法或结构可能跟本书给出的任何程序示例都不同。如果需要硬件设计,它 所涉及的基本逻辑电路部件的布局和互连可能跟本书所示的任何设计示例都不同。如 果要进行性能分析,它可能需要推导代数表达式。

课程安排

本书适合作为大学计算机组成入门课程一学期的教材。

书中提供了多于一个学期课程所要讲授的内容,第1 章至第 9 章给出了关于计算机组成 和有关软件问题的核心内容。未学习过逻辑电路课程的学生,应该在学习第5 章之前学习附录 A 的内容。

针对嵌入式系统的课程应该包括第1、2、3、4、7、8、10 和 11 章。

感兴趣的学生可在教师的指导下在相关的硬件实验室中实践附录B 到 E 中商用处理器例 子的内容。

致谢

在此,向许多在第6 版筹备期间提供帮助的朋友们表示衷心的感谢。

我们的同事——南巴黎大学的Daniel Etiemble 和多伦多大学的 Glenn Gulak,提供了许多 有助于内容成型的建设性的意见和建议。

Blair Fort 和 Dan Vranesic 提供了一些有价值的程序实例。

罗切斯特理工学院的Warren R. Carithers、北德州大学的 Krishna M. Kavi 和中西部州立大 学的Nelson Luiz Passos 对本书第 5 版和第 6 版的内容提供了书评。

对本书第5 版的内容提供过书评的还有以下人员 :多媒体大学的 Goh Hock Ann、科罗 拉多大学丹佛分校的Joseph E. Beaini、尼赫鲁科技大学的 Kalyan Mohan Goli、示范工程学院

(埃尔讷古勒姆)的Jaimon Jacob、安娜大学(哥印拜陀)的 M. Kumaresan、香港城市大学的 Kenneth K. C. Lee、技术教育和研究协会的 Manoj Kumar Mishra、马来西亚理科大学的 Junita Mohamad-Saleh、布巴内斯瓦尔工程技术学院的 Prashanta Kumar Patra、“国立台湾科技大学”

的Shanq-Jang Ruan、G. B. Pant 农业技术大学的 S. D. Samantaray、阿克伦大学的 Shivakumar

(10)

Sastry、米兰理工大学的 Donatella Sciuto、巴特那国家技术研究所的 M. P. Singh、阿肯色大学 的Albert Starling、加州大学欧文分校的 Shannon Tauro、孔古工程学院的 R. Thangarajan、鲁尔 克拉国家技术研究所的Ashok Kunar Turuk 和辛辛那提大学的 Philip A.Wilsey。

最后,我们衷心感谢McGraw-Hill 的 Raghothaman Srinivasan、Peter E. Massar、Darlene M.

Schueller、Lisa Bruflodt、Curt Reynolds、Brenda Rolwes 和 Laura Fuller 的支持。

Carl Hamacher Zvonko Vranesic Safwat Zaky Naraig Manjikian

(11)

Carl Hamacher 加拿大滑铁卢大学工程物理学士,加拿大女皇大学电子工程硕士,纽约 州锡拉丘兹大学电子工程博士。1968 ~ 1990 年担任加拿大多伦多大学电子工程系和计算机科 学系教授,1984 ~ 1988 年担任计算机系统研究所所长,1988 ~ 1990 年担任工程科学部主席。

1991 年进入女皇大学工作,1991 ~ 1996 年任应用科学系主任,现为电子与计算机工程系荣誉 退休教授。1978 ~ 1979 年曾作为访问学者到美国加州圣何塞的 IBM 研究实验室工作。1986 年作为访问研究员在法国格勒诺布尔大学电路与系统实验室工作。1996 ~ 1997 年作为访问教 授在美国加州大学河滨分校计算机科学系和法国巴黎第六大学LIP6 实验室工作。

他的研究方向为多处理器与多计算机,侧重于互连网络。

Zvonko Vranesic 多伦多大学电子工程学士、硕士及博士。1963 ~ 1965 年在加拿大安 大略省Bramalea 的北方电子有限公司(the Northern Electric Co. Ltd.)任设计工程师。1968 年 进入多伦多大学工作,现为电子与计算机工程系荣誉退休教授。1978 ~ 1979 年作为高级访问 学者访问英国剑桥大学,1984 ~ 1985 年作为访问学者访问巴黎第六大学。1995 ~ 2000 年任 多伦多大学工程科学部主任。还曾在Altera 公司多伦多技术中心参与研究与开发工作。

他现在的研究方向为计算机体系结构和现场可编程VLSI 技术。

他也是《Fundamentals of Digital Logic with VHDL Design》(第 3 版)、《Fundamentals of Digital Logic with Verilog Design》(第 2 版)、《Microcomputer Structures》及《Field-Programmable Gate Arrays》四本书的合著者。1990 年,由于其“对本科实验指导的创新和与众不同的贡献”获得 Wighton 奖金。2004 年,获得多伦多大学应用科学与工程学院的学院教学成果奖。

Safwat Zaky 埃及开罗大学电子工程和数学双学士,后获多伦多大学电子工程硕士 及博士学位。1969 ~ 1972 年在加拿大安大略省 Bramalea 的贝尔北方研究室(Bell Northern Research)从事光电子及磁性在大规模存储与电话交换中的应用研究。1973 年进入多伦多大学 工作,1993 ~ 2003 年任系主任,2003 ~ 2009 年任副教务长,现为电子与计算机工程系荣誉 退休教授。1980 ~ 1981 年他曾作为高级访问学者在英国剑桥大学计算机实验室工作。

他是加拿大工程院院士,其研究方向为计算机体系结构、数字电路设计及电磁兼容性分 析。他还是《Microcomputer Structures》一书的合著者,并且荣获了 IEEE 第三千禧年奖章

(the IEEE Third Millennium Medal)和多伦多大学杰出服务 Vivek Goel 奖。

Naraig Manjikian 加拿大滑铁卢大学计算机工程学士和电子工程硕士,多伦多大学电子 工程博士。1997 年进入加拿大金斯顿女皇大学工作,2004 ~ 2006 年担任计算机工程本科主任,

2006 ~ 2007 年担任电子与计算机工程系执行主任,2007 ~ 2009 年担任学生及校友事务副主 任,现为电子与计算机工程系副教授。2003 ~ 2004 年作为访问教授在加拿大蒙特利尔的麦吉 尔大学(McGill University)和英属哥伦比亚大学(the University of British Columbia)工作。

2010 ~ 2011 年作为访问教授在麦吉尔大学工作。

他的研究方向为计算机体系结构、多处理器系统、现场可编程VLSI 技术以及并行处理 应用。

(12)

出版者的话 译者序 前言 作者简介

第1 章 计算机的基本结构 1 1.1 计算机的类型 1

1.2 功能部件 2

1.2.1 输入设备 3 1.2.2 存储器 3 1.2.3 运算器 4 1.2.4 输出设备 4 1.2.5 控制器 4 1.3 基本操作概念 4 1.4 数的表示及算术运算 6 1.4.1 整数 6 1.4.2 浮点数 11 1.5 字符表示 11

1.6 性能 12

1.6.1 技术 13 1.6.2 并行性 13 1.7 发展历程 13 1.7.1 第一代计算机 14 1.7.2 第二代计算机 14 1.7.3 第三代计算机 14 1.7.4 第四代计算机 14

1.8 结束语 15

1.9 问题解析 15

习题 16

参考文献 17

第2 章 指令集体系结构 18 2.1 存储单元和地址 18 2.1.1 按字节寻址能力 19 2.1.2 大端和小端分配 20 2.1.3 字的对齐 20 2.1.4 访问数和字符 20 2.2 存储器操作 21

2.3 指令和指令序列 21 2.3.1  寄存器传送标记 21 2.3.2  汇编语言符号 22 2.3.3  RISC 和 CISC 指令集 22 2.3.4  RISC 指令集介绍 23 2.3.5  指令执行和线性序列 24 2.3.6  转移 25 2.3.7  生成存储器地址 26 2.4  寻址方式 26 2.4.1  变量和常数的实现 27 2.4.2  间接和指针 28 2.4.3  变址和数组 29 2.5  汇编语言 32 2.5.1  汇编指示 33 2.5.2  程序的汇编和执行 35 2.5.3  数的表示 36

2.6  堆栈 36

2.7  子程序 38 2.7.1  子程序嵌套及处理器堆栈 39 2.7.2  参数传递 39 2.7.3  堆栈的结构 42 2.8  其他指令 44 2.8.1  逻辑指令 44 2.8.2  移位和循环移位指令 45 2.8.3  乘法和除法 47 2.9  处理 32 位的立即值 47 2.10  CISC 指令集 48 2.10.1  其他寻址方式 49 2.10.2  条件码 50 2.11  RISC 和 CISC 风格 51 2.12  实例程序 52 2.12.1  向量点积程序 52 2.12.2  字符串搜索程序 53 2.13  机器指令的编码 54 2.14  结束语 56 2.15  问题解析 56

习题 59

(13)

第3 章  基本输入 / 输出 63 3.1  访问 I/O 设备 63 3.1.1  I/O 设备接口 64 3.1.2  程序控制 I/O 64 3.1.3  一个 RISC 风格的 I/O 程序

示例 67

3.1.4  一个 CISC 风格的 I/O 程序

示例 67

3.2  中断 68

3.2.1  中断的允许与禁止 70 3.2.2  处理多台设备 71 3.2.3  控制 I/O 设备行为 72 3.2.4  处理器控制寄存器 73 3.2.5  中断程序示例 74 3.2.6  异常 78 3.3  结束语 79 3.4  问题解析 79

习题 83

第4 章  软件 86 4.1  汇编过程 86 4.2  装载及执行目标程序 87 4.3  连接程序 88

4.4  库 88

4.5  编译器 88 4.5.1  编译器优化 89 4.5.2  组合不同语言编写的程序 89 4.6  调试器 90 4.7  使用高级语言实现输入 / 输出

任务 90

4.8  汇编语言与 C 语言的交互 92 4.9  操作系统 95 4.9.1  引导程序 96 4.9.2  管理应用程序的执行 96 4.9.3  中断在操作系统中的使用 97 4.10  结束语 99

习题 99

参考文献 100

第5 章  基本处理部件 101 5.1  一些基本概念 101 5.2  指令的执行 103 5.2.1  Load 指令 103

5.2.2  算术及逻辑运算指令 104 5.2.3  Store 指令 104 5.3  硬件组件 105 5.3.1  寄存器文件 105 5.3.2  ALU 106 5.3.3  数据通路 106 5.3.4  取指令部分 108 5.4  指令的读取和执行步骤 109 5.4.1  转移 111 5.4.2  等待存储器 113 5.5  控制信号 114 5.6  硬件控制 116 5.6.1  数据通路控制信号 117 5.6.2  存储器延迟的处理 118 5.7  CICS 风格的处理器 118 5.7.1  使用总线实现互连 119 5.7.2  微程序控制 121 5.8  结束语 122 5.9  问题解析 122

习题 124

第6 章  流水线 127 6.1  基本概念——理想情况 127 6.2  流水线结构 128 6.3  流水线问题 129 6.4  数据依赖性 129 6.4.1  操作数转发 129 6.4.2  用软件处理数据依赖性 130 6.5  存储器延迟 131 6.6  转移延迟 132 6.6.1  无条件转移 132 6.6.2  条件转移 133 6.6.3  转移延迟槽 133 6.6.4  转移预测 134 6.7  资源限制 136 6.8  性能评估 137 6.8.1  停顿和时间代价的影响 137 6.8.2  流水线的段数 138 6.9  超标量操作 139 6.9.1  转移和数据依赖性 140 6.9.2  无序执行 141 6.9.3  执行完成 141

(14)

6.9.4  调度操作 142 6.10  CISC 处理器中的流水线 143 6.10.1  ColdFire 处理器中的流水线 144 6.10.2  Intel 处理器中的流水线 144 6.11  结束语 144 6.12  问题解析 145

习题 146

参考文献 148

第7 章  输入 / 输出组织结构 149 7.1  总线结构 149 7.2  总线操作 150 7.2.1  同步总线 150 7.2.2  异步总线 152 7.2.3  电气考虑 154 7.3  总线仲裁 154 7.4  接口电路 156 7.4.1  并行接口 156 7.4.2  串行接口 159 7.5  互连标准 161 7.5.1  通用串行总线 162 7.5.2  火线 164 7.5.3  PCI 总线 165 7.5.4  SCSI 总线 168 7.5.5  SATA 169 7.5.6  SAS 169 7.5.7  PCI Express 169 7.6  结束语 170 7.7  问题解析 170

习题 172

参考文献 173

第8 章  存储器系统 174 8.1  基本概念 174 8.2  半导体随机存储器 175 8.2.1  存储器芯片的内部组织结构 176 8.2.2  静态存储器 177 8.2.3  动态随机存储器 178 8.2.4  同步动态随机存储器 180 8.2.5  大容量存储器的结构 182 8.3  只读存储器 184 8.3.1  ROM 184 8.3.2  PROM 185

8.3.3  EPROM 185 8.3.4  EEPROM 185 8.3.5  闪存 186 8.4  直接存储器访问 186 8.5  存储器层次结构 188 8.6  高速缓存 189 8.6.1  映射功能 190 8.6.2  替换算法 193 8.6.3  映射技术的例子 194 8.7  性能因素 196 8.7.1  命中率和失效开销 196 8.7.2  处理器芯片上的高速缓存 198 8.7.3  其他改进 198 8.8  虚拟存储器 200 8.9  存储器管理需求 203 8.10  辅助存储器 204 8.10.1  磁盘 204 8.10.2  光盘 208 8.10.3  磁带系统 211 8.11  结束语 212 8.12  问题解析 212

习题 215

参考文献 217

第9 章  算术运算 218 9.1  有符号数加减法 218 9.2  快速加法器设计 220 9.3  无符号数乘法 224 9.3.1  阵列乘法器 224 9.3.2  顺序电路乘法器 225 9.4  有符号数乘法 227 9.5  快速乘法 229 9.5.1  乘数位偶重编码 229 9.5.2  求和项的进位保留加法 229 9.5.3  使用 3-2 简化器的求和项

加法树 231 9.5.4  使用 4-2 简化器的求和项

加法树 233 9.5.5  快速乘法总结 234 9.6  整数除法 234 9.7  浮点数及其运算 236 9.7.1  浮点数算术运算 238

(15)

9.7.2  保护位与截取 239 9.7.3  浮点操作的实现 240 9.8  十进制数到二进制数的转换 242 9.9  结束语 242 9.10  问题解析 243

习题 245

参考文献 248

第10 章  嵌入式系统 249 10.1  嵌入式系统实例 249 10.1.1  微波炉 249 10.1.2  数码照相机 251 10.1.3  家用遥测技术 252 10.2  嵌入式应用中的微控制器芯片 252 10.3  一个简单的微控制器 253 10.3.1  并行 I/O 接口 253 10.3.2  串行 I/O 接口 256 10.3.3  计数器 / 定时器 256 10.3.4  中断控制机制 258 10.3.5  编程实例 258 10.4  反应定时器—— 一个完整的

实例 261

10.5  传感器与执行器 264 10.5.1  传感器 264 10.5.2  执行器 266 10.5.3  应用实例 266 10.6  微控制器系列 267 10.6.1  基于 Intel 8051 的微控制器 268 10.6.2  Freescale 微控制器 268 10.6.3  ARM 微控制器 269 10.7  设计问题 269 10.8  结束语 271

习题 271

参考文献 273

第11 章  片上系统——案例研究 274 11.1  FPGA 的实现 274 11.1.1  FPGA 器件 275 11.1.2  处理器的选择 275 11.2  计算机辅助设计工具 275 11.3  闹钟示例 279 11.3.1 系统的用户视图 279 11.3.2  系统的定义和生成 279 11.3.3  电路实现 281 11.3.4  应用软件 281 11.4  结束语 287

习题 287

参考文献 288

第12 章  并行处理及性能 289 12.1  硬件多线程 289 12.2  向量(SIMD)处理 290 12.3  共享存储器的多处理器 292 12.4  高速缓存一致性 295 12.4.1  直接写协议 295 12.4.2  写回协议 296 12.4.3  监听高速缓存 296 12.4.4  基于目录的高速缓存一致性 297 12.5  消息传递多计算机 298 12.6  多处理器并行编程 298 12.7  性能建模 300 12.8  结束语 301

习题 301

参考文献 302

附录A 逻辑电路 303 附录B Altera Nios II 处理器 344 附录C ColdFire 处理器 371 附录D ARM 处理器 397 附录E Intel IA-32 体系结构 431

索引 461

(16)

计算机的基本结构

本章目标

在本章中你将学习以下内容:

计算机的不同类型

计算机的基本结构与操作

机器指令及其执行

数与字符的表示

二进制数的加法与减法

计算机系统中的基本性能问题

计算机发展简史

本书讲述的是计算机的组成结构。书中描述了数字计算机中用于存储和处理信息的各个 部件的功能和设计,还介绍了与计算机相连的从外部设备接收信息的输入部件和向外部指定设 备传送计算结果的输出部件。输入、存储、处理和输出操作由组成程序的一系列指令管理。

本 书 的 大 部 分 内 容 是 专 门 针 对 计 算 机 硬 件(computer hardware)和计算机体系结构

(computer architecture)的。计算机硬件由电子电路、磁性和光存储介质、显示器、电气机械 设备以及通信设施等构成,计算机体系结构包含具体的指令集和用于执行这些指令的硬件设备 的功能行为。

本书还介绍了计算机系统中有关程序设计和软件组件方面的许多知识。要想对计算机系 统有一个好的认识,重要的是对各个计算机部件设计中的硬件和软件都要有所认识。

1.1 计算机的类型

自20 世纪 40 年代数字计算机发明以来,计算机已逐步分化为在其大小、成本、计算能 力和使用目的上有着很大不同的许多类型。现代计算机大致可以分为四大类:

嵌入式计算机

● (embedded computer)集成在一个较大的设备或系统中,用以自动监控 与控制物理过程或环境。它们被用于特定的目的,而不是通用的任务处理。其典型应 用包括工业和家庭自动化、家电、通信产品和交通工具。用户甚至可能并不知道计算 机在这类系统中发挥了作用。

个人计算机

● (personal computer)在家庭、教育机构以及商业与工程办公环境中广泛 使用,但主要用于个人用途。个人计算机支持各种各样的应用,如通用计算、文档编 制、计算机辅助设计、视听娱乐、人际交流和互联网浏览。如今有很多种对个人计算 机进行分类的方法。台式计算机(desktop computer)可以满足一般的需求,并占用较 少的工作空间。工作站计算机(workstation computer)为工程和科学计算提供更高的 计算能力和更强大的图形显示能力。便携式计算机(portable computer)和笔记本电脑

(notebook computer)提供了个人计算机的基本功能,它们可以使用电池操作以提供一 定的移动性。

● 服务器(server)和企业系统(enterprise system)是能被大量用户共享的大型计算机,

这些用户通常会从某种形式的个人计算机上通过公有或私有网络发起访问。这些计算 1

(17)

机可包含大型的数据库,为政府机构或商业组织提供信息处理服务。

超级计算机

● (super computer)和网格计算机(grid computer)通常提供最高的性能,它 们是最昂贵的以及物理上最大型的计算机。超级计算机用于天气预报、工程设计与仿 真以及科研等对计算要求极高的领域中。因为超级计算机需要很高的成本,所以出现 了更经济的网格计算机。网格计算机把大量的个人计算机和磁盘存储单元整合在一个 物理上分散的高速网络中,这称为网格,它被当成一个整体计算资源来管理。通过在 网格中均匀地分配计算工作量,网格计算机可以在数值计算和信息检索等大型应用上 获得很高的性能。

计算机界的一个新趋势是云计算(cloud computing)。个人计算机用户为了自己的计算需 求去访问广泛分布的计算和存储服务器资源。互联网提供了必要的通信设施。云端软硬件服务 提供商把云作为一种工具进行运作,基于按使用付费的模式进行收费。

1.2 功能部件

计算机包括五个功能相对独立的主要部分:输入设备、存储器、算术逻辑部件、输出设备 和控制器,如图1-1 所示。输入设备接收来自使用键盘等设备的操作员或者通过数字通信线路 连接的其他计算机上的编码信息。所接收的信息存储在计算机的存储器中供以后使用,或者立 即被算术逻辑部件处理。这个处理步骤是由同样存储在存储器中的一个程序指定的。最后,处 理的结果通过输出设备送回到外部设备中。所有这些动作都是由控制器控制和协调的。互连网 络提供了这些功能部件间交换信息和协调动作的方法,后面的章节将会详细讨论单个部件以及 它们之间的互连。前面提到的算术逻辑电路与主控制电路结合构成了处理器(processor),输 入设备和输出设备通常整体称为输入/ 输出(input-output, I/O)设备。

存储器

互连网络

算术逻辑部件

控制器 处理器 输入设备

输出设备 输入/ 输出设备

1-1 计算机的基本功能部件

现在仔细观察一下计算机所处理的信息。把信息划分成指令和数据以便于讨论。指令

(instruction),或称为机器指令(machine instruction),是具体的命令,它们:

控制计算机与I/O 设备之间以及计算机内部的信息传送。

指定要执行的算术和逻辑运算。

程序(program)是执行任务的指令序列。程序存储在存储器中。处理器从存储器中一条 接一条地取出程序指令,然后完成所需要的操作。除了可能有来自于操作员或与计算机连接的 I/O 设备上的外部中断以外,计算机由所存储的程序控制。数据(data)是指作为指令操作数 的数字和字符。数据也存储在存储器中。

计算机处理的指令和数据必须按照适当的格式进行编码。当今的大多数硬件使用的是只 有两个稳定状态的数字电路。指令、数字或字符都被编码成叫做位(bit)的二进制数字串,每 个位只能从表示两个稳定状态的0 和 1 中取一个。数字通常用按位二进制记数法表示,这将在 1.4 节中讨论。字母数字字符也可以用二进制码表示,这将在 1.5 节中讨论。

2

3

(18)

1.2.1 输入设备

计算机通过输入设备接收编码后的信息。最常见的输入设备就是键盘。当一个键被敲击 时,相应的字母或数字就会自动转换成相应的二进制码并传送到处理器中。

还有许多其他类型的用于人机交互的输入设备,包括触摸板、鼠标、操纵杆和轨迹球。

这些设备经常作为图形输入装置与显示器一起使用。麦克风可以用来捕获音频输入,然后对其 取样并转换为数字编码进行存储和处理。同样,摄像头可以用来捕获视频输入。

数字通信设施,例如互联网,也可以从其他计算机或数据库服务器向一台计算机提供输入。

1.2.2 存储器

存储器的功能是存储程序和数据。它分为主存储器和辅助存储器两种。

1.主存储器

主存储器(primary memory),也称为主存(main memory),是以电子速度运行的高速存储 器。程序在执行时必须要存储在主存中。主存由大量的半导体存储单元(cell)组成,每一个存 储单元能够存储一位二进制信息。这些单元很少被单独地读取或写入,而是按固定大小的组进 行处理,这个组称为字(word)。主存这样组织以便于在一个基本操作中可以存储或检索一个 字。每个字所包含的位数称为计算机的字长(word length),典型的字长有 16、32 或 64 位。

为了能方便地访问主存中的任何一个字,每个字单元都与一个不同的地址(address)相 关联。地址是从0 开始的,是用来识别逐个单元的连续数字。指明一个特定字的地址,然后向 主存发出一条开始进行存储或检索过程的控制命令,就能够对该字进行访问了。

在处理器的控制下,指令和数据既可以写入主存也可以从主存中读出。在主存中能够尽 快地访问到任意位置的字是非常重要的。其中的任何单元在指明了地址后都能在一个很短的固 定时间内访问到的存储器,叫做随机访问存储器(random-access memory, RAM),访问一个字 所需要的时间叫做存储器访问时间(memory access time)。这个时间与所访问的字的位置无关。

当今RAM 设备的访问时间通常在几纳秒(ns)至 100 纳秒之间。

2.高速缓存

作为主存储器的辅助手段,一个更小、更快的被称为高速缓存(cache)的 RAM 设备可 用于存储目前正在执行的程序段以及所有相关的数据。高速缓存与处理器紧密耦合,它们通常 被装在同一个集成电路芯片上。高速缓存的目的是为了提高指令的执行速率。

在程序开始执行的时候,高速缓存是空的。所有程序指令和任何所需的数据都存储在主 存中。随着执行过程的推进,指令被读取到处理器芯片中,并且在高速缓存中存放每一条指令 的副本。当指令的执行需要主存中的数据时,数据被取出并同时被拷贝到高速缓存中。

现在,假设许多指令在一段很短的时间内重复执行,比如程序中的循环语句。如果这些指 令可从高速缓存中获得,那么它们可以在重复使用时被很快地取出来。类似地,如果相同的数 据单元被反复访问,而这些内容的副本可从高速缓存中获得,那么它们就可以被很快地取出来。

3.辅助存储器

虽然主存储器是必需的,但它的价格也是昂贵的,而且断电后无法保存信息。因此在需 要存储大量数据和程序,尤其是那些不经常访问的信息时,就会使用比较便宜的永久性辅助 存储器(secondary storage)。辅助存储器的访问时间比主存储器的长。辅助存储设备有很多 种,包括磁盘(magnetic disk)、光盘(optical disk,DVD 和 CD)和闪存设备(flash memory device)等。

4

(19)

1.2.3 运算器

大多数计算机的操作是由处理器的算术逻辑部件(arithmetic and logic unit,ALU)或运算 器执行的。任意的算术或逻辑运算,比如加、减、乘、除或比较大小,都是通过将所需的操作 数送至由ALU 执行运算的处理器中开始的。例如,如果将主存中放置的两个数求和,那么它 们被送入处理器中,然后由ALU 执行加法操作。所求得的和可能存储在主存中或保留在处理 器中以便直接使用。

当操作数被送入处理器时,它们被存储在叫做寄存器(register)的高速存储单元中。每个 寄存器可以存储一个字的数据。寄存器的访问时间比处理器芯片上的高速缓存的访问时间更短。

1.2.4 输出设备

输出设备与输入设备相对应。它的功能是向外界输出处理结果。这类设备中一个常见的 例子是打印机(printer)。大多数打印机使用激光打印机中的复印技术或是喷墨流完成打印过 程。这样的打印机每分钟至少可以打印20 页。但是,打印机是机械设备,这样的速度和处理 器的电子速度相比仍然是很慢的。

一些设备,比如图形显示器,既有显示文字与图形这样的输出功能,又有通过触摸技术 实现的输入功能。这也是很多情况下对这种具有双重作用的设备使用单一名称输入/ 输出设备 的原因。

1.2.5 控制器

存储器、运算器和输入/ 输出设备对信息进行存储和处理,然后执行输入和输出操作。这 些设备的操作必须按照一定的方式互相协调,这就是控制器的职责。控制器是高效的中枢系 统,它将控制信号传送到其他设备并检测它们的状态。

由输入和输出操作构成的I/O 传输是由程序指令控制的,程序指令识别相关的设备和 需要传输的信息。控制电路负责产生控制传输和决定何时发生规定动作的时序信号(timing signal)。处理器和存储器之间的数据传送也是由控制器通过时序信号控制的。于是有理由将控 制器看成一个意义明确而且物理上完全独立的设备,它和计算机的其他部分相互作用。但在实 际中情况却恰恰相反。很多控制电路分布于整个计算机中。大量的控制线(缆线)传递着所有 部件中事件的时序和同步信号。

一台计算机的操作可以归纳如下:

计算机通过输入设备以程序和数据的形式接收信息,然后将其存储在存储器中。

在程序的控制下,存储在存储器中的信息被取出,然后送入运算器中进行处理。

经过处理的信息由输出设备送出计算机。

计算机内的所有活动都由控制器控制。

1.3 基本操作概念

在1.2 节中,我们介绍了计算机的活动是由指令控制的。为了执行一个给定的任务,要在 存储器中存储一个包含一连串指令的相应程序。完成特定操作的指令从存储器中取出,然后送 入处理器中,用作指令操作数的数据也存储在存储器中。

一条典型的指令如下:

5

6

(20)

Load R2, LOC

这条指令将读取地址标签LOC 所指向的存储单元的内容,然后将其装入处理器寄存器 R2 中。

LOC 单元中原来的内容被保存了下来,而寄存器 R2 中的原始内容被覆盖了。这条指令需要执 行若干步。首先,指令从存储器中取出并被送入处理器中。然后,由控制器确定将要执行的操 作,从存储器中取出LOC 单元的操作数并送入处理器。最后,将操作数存储到寄存器 R2 中。

在操作数已经从存储器装入处理器寄存器后,就可以对它们进行算术或逻辑运算了。例 如,指令

Add R4, R2, R3

把寄存器R2 与 R3 的内容相加,然后将它们的和放入寄存器 R4 中。R2 与 R3 中的操作数并未 发生改变,但R4 中先前的值被计算结果覆盖了。

完成所需的操作后,计算结果还在处理器寄存器中。可以通过使用如下指令将计算结果 传送到存储器中

Store R4, LOC

这条指令将寄存器R4 中的操作数复制到存储单元 LOC 中。单元 LOC 中的原始内容被覆盖,

但是R4 的原始内容被保存了下来。

对Load 和 Store 指令而言,存储器和处理器之间的传送从发送所需要的存储单元地址给 存储器并发出适当的控制信号开始,然后将数据送入或送出存储器。

图1-2 显示了存储器和处理器是如何连接在一起的,也显示了一些还没有讨论过的处理器 部件。这些部件间的互连并没有明确表示出来,因为到此为止我们只讨论了它们的功能特性。

第5 章将详细描述作为处理器结构一部分的互连的细节。

除ALU 和控制电路外,处理器中还包含许多用于不同目的的寄存器。指令寄存器

(instruction register, IR)保存当前正在执行的指令。它的输出结果可由控制电路使用,以产生 控制指令执行过程中不同处理部件的时序信号。程序计数器(program counter, PC)是另一个 专用的寄存器。它包含下一条即将被读取和执行的指令的存储器地址。在一条指令的执行过 程中,PC 中的内容相应地更新为下一条将被执行指令的地址。习惯上说 PC 指向(point)下 一条将从存储器中取出的指令。除了IR 和 PC,图 1-2 还给出了通用寄存器(general-purpose register)R0 到 Rn-1,通常也被称作处理器寄存器。它们的功能有很多,包括保存从存储器中载 入的待处理的操作数。通用寄存器的作用将在第2 章中详细解释。

PC

IR

Rn–1 ALU R1 R0 主存储器

处理器-存储器接口

n 个通用寄存器

控制器

处理器

1-2 处理器和主存储器之间的连接

7

(21)

处理器-存储器接口是管理主存储器和处理器之间数据传输的电路。如果需要从存储器中 读取一个字,该接口会向存储器发送该字的地址,同时送出一个读控制信号。接口等待要取回 的字,然后将它传输到适当的处理器寄存器中。如果一个字需要被写入到存储器中,接口会向 存储器传输该字的存储地址和内容,同时送出一个写控制信号。

现在来看一下典型的操作步骤。为了便于执行,程序必须存储在主存储器中,而且通常 是通过输入设备从辅助存储器传输到主存储器的。当PC 指向程序的第一条指令时,程序开始 执行。PC 中的内容连同一个读控制信号一起传送到存储器中。当被寻址的字(在这里是程序 的第一条指令)从存储器中读出时,它被装入寄存器IR 中。此时,指令便可以进行解释并执 行了。

Load、Store 和 Add 等指令执行数据传输与算术操作。如果指令需要一个保存在存储器中 的操作数,就需要通过将它的地址发送给存储器并启动一个读操作来获取。当这个操作数已经 从存储器中读出时,它将被传送到处理器寄存器中。当操作数按照这种方式取出后,ALU 就 可以对处理器寄存器中的值执行所需要的算术运算了,比如加法。运算结果会送到一个处理器 寄存器中。如果这个结果将通过Store 指令被写入存储器中,它会被从处理器寄存器传输到存 储器中,存储该结果的单元地址也将送往存储器,然后开始一个写操作。

在每条指令执行过程中的某个点上,PC 中的内容递增,以便使 PC 指向下一条要执行的 指令。这样,一旦当前的指令执行完毕,处理器就可以读取新的指令了。

除了在存储器和处理器之间传送数据外,计算机还从输入设备接收数据以及向输出设备 输出数据,为此提供了一些处理I/O 传送的机器指令。

当一些设备需要紧急服务时,程序的正常执行可能会被中断。例如,在一个计算机控制 的工业流程中,监视器可能观察到了一个危险的情况。为了立即做出响应,必须暂停当前程 序的执行。为此,设备发出一个中断(interrupt)信号,向处理器提出服务请求。处理器通过 执行中断服务程序(interrupt-service routine)来提供所请求的服务。因为这样的转变可能会改 变处理器的内部状态,所以必须在处理中断请求之前将处理器的状态保存在存储器中。通常,

要保存的信息包括PC 中的内容、通用寄存器的内容以及一些控制信息。当中断服务程序完成 时,处理器的状态就从存储器中恢复,从而使得被中断的程序可以继续执行。

这一节对计算机的操作进行了简略介绍,在后面的章节中我们还将详细讨论这些概念。

第2、3、4 章将首先从程序员的角度来详细描述这些概念,而后面的章节将从硬件设计师的角 度来详细描述这些概念。

1.4 数的表示及算术运算

在计算机系统中表示数的最基本方法是使用一串位,即一个二进制数。我们首先描述整 数的二进制表示及算术运算,然后将简单介绍浮点数的表示。

1.4.1 整数

考虑一个 n 位的向量

B = bn-1…b1b0

对于0 ≤ i ≤ n - 1,bi = 0 或 1。这个向量在 0 到 2n-1 的范围内可以用一个无符号整数 V(B) 表示,这里

8

9

(22)

V (B) = bn-1 × 2n-1 + … + b1 × 21+ b0 × 20 我们需要表示正数和负数,有三种编码系统可以用来表示这些数:

● 原码

● 反码

● 补码

在这三种编码体系中,最左边一位为“0”时表示正数,为“1”时表示负数。图 1-3 用 4 位数举例说明了在这三种体系中数字的表示方法。在所有的编码体系中正数的表示法相同,而 负数有着不同的表示方法。在原码(sign-and-magnitude)系统中,负数值是将相应正数值的向 量 B 中的最高有效位(图1-3 中的 b3)由0 变为 1 来表示的。例如:+5 表示为 0101,-5 表示 为1101。

在反码(1’s-complement)表示中,负数值是通过将相应正数中的每一位求反而获得的。

因此,-3 的表示就是通过对向量 0011 的各位求反得到了 1100。运用同样的按位求反操作也可 以把一个负数转换成相应的正数。这种转换方法就称作给一个特定的数取反。对于 n 位数,为 其生成反码的操作相当于从2n-1中减去这个数,在图1-3 中的 4 位数情况下也就是从 24-1=15 或者二进制的1111 中减去该数。

最后,在补码(2’s-complement)系统中,一个 n 位数的补码是从 2n 中减去这个数而得到 的。因此,一个数的补码可以用这个数的反码加1 而获得。

00 0 00 0 00 1 11 1 11 11 00 00 0 00 0 1 11 1

11 11 1 10 01 1 00 0 01 1 00 1 1 1 01 0 10 10 0 10 1 01 0 1

1 +

1

2 +3 +4 +5 +6 +7 +

2 3

4 5 6

7

8 0

+0

1 +2 +3 +4 +5 +6 +7 +

0 +

7 6

5 4 3

2 1 0

1 +2 +3 +4 +5 +6 +7 +

0 +

7

6 5 4

3 2 1 b3b2b1b0

B 所表示的值

原码 反码 补码

图1-3 二进制有符号整数的表示

值得注意的是,在原码和反码系统中,“+0”和“-0”都有着不同的表示,而在补码系统 中“0”只有一种表示。如图 1-3 所示,对 4 位数来说,在补码系统中能表示数值 -8,而在其 他系统中却不能。原码系统看起来是最自然的,因为在笔算中我们就是用原码系统来处理十进 制数的。反码系统很容易与这个系统关联起来,而补码系统可能显得有点不自然。但是,我们 将会说明补码系统为实现加法和减法运算提供了最有效的方法,它是现代计算机中最常用的方 法之一。

1.无符号整数的加法

图1-4 说明了 1 位数的加法。1 和 1 相加的和是一个 2 位的向量 10,表示数值 2。我们说 10

(23)

这个和(sum)是 0,进位输出(carry-out)是 1。为了完成多位数相加,我们使用一种类似于 十进制数笔算中使用的方法。从这个位向量的最

低位(右边)开始进行两位相加,并将进位传递 到它的高位(左边)上去。某位上两个数相加所 得的进位输出作为左边下一位的进位输入(carry- in)。进位输入必须与那个位置的两位相加,产生 和以及进位输出。例如,如果某位的两个数都是

1,并且进位输入也是 1,则和为 1,进位输出也为 1,即表示数值 3。

2.有符号整数的加法和减法

我们介绍了表示正数和负数(或简称为有符号数(signed number))的三种系统。这些系 统的不同之处仅在于对负数的表示方式。从是否容易执行算术运算的观点来看它们的优势可以 归纳如下。原码系统在表示上是最简单的,但是它对于执行加法和减法的运算是最不便的。反 码表示法稍微好一些,补码系统对于执行加法和减法运算是最有效的。

为了理解补码的算术运算,考虑以 N 为模的加法(简写成mod N)。描述无符号整数 mod N 加法的有效图示方式是使用一个圆,沿着它的圆周标记上值 0 到 N-1,如图 1-5a 所示。考 虑当 N = 16 的情况,如图 1-5b 所示。十进制数 0 到 15 可以用圆外侧的 4 位二进制数 0000 到 1111 表示。就十进制数而言,(7+5) mod 16 运算得到的值是 12。我们使用图形执行这个运算,

在圆外侧找到7(0111) 的位置,然后按顺时针方向移动 5 个单位就到达了答案 12(1100) 处。类 似地,(9 + 14) mod 16 = 7,即在圆上找到 9(1001),然后按顺时针方向移动 14 个单位越过 0 的 位置就到达答案7(0111) 处。对于任何无符号数 a 和 b 来说,这种图形技术对计算(a+b)mod 16 都是有效的,即为了完成加法,定位 a,然后按顺时针方向移动 b 个单位就可以得到 (a + b) mod 16 的结果。

现在考虑对于模数为16 的圆的另一种不同解释。我们按照圆内侧所示的补码表示将圆外 侧的二进制向量重新解释成从 -8 到 +7 的有符号数。

将mod 16 的加法技术应用在将 +7 加到 -3 的例子上。这两个数的补码表示分别是 0111 和1101。为了完成两数相加,在图 1-5b 的圆周上找到 0111,然后按顺时针方向移动 1101 (13) 步到达了0100 处,得到了 +4 的正确答案。值得注意的是,-3 的补码表示被解释成一个无符 号数以表示移动的步数。

如果采用从右到左按位加的方法完成这个加法,我们得到:

0 1 1 1 + 1 1 0 1 1 0 1 0 0 进位

如果在这个加法中忽略第四位上的进位,就得到了一个正确的答案。实际上就是这样做 的。忽略这个进位是对 N 取模运算的自然结果。当我们在图1-5b 中绕着圆移动时, 1111 值的 下一个值通常应该是10000,而我们回到了 0000 值。

使用补码表示系统的 n 位有符号数的加法和减法规则可以描述如下:

● 两个数相加(add)时,它们的 n 个表示位相加,忽略最高有效位(MSB)上的进位 位。如果实际结果是在 -2n-1到 +2n-1-1 的范围之内,那么它们的和将是用补码表示的 代数运算的正确值。

X和 Y 两个数相减(subtract),也就是执行 X-Y 时,求出 Y 的补码形式,然后使用加 11

12

进位输出 1 1 +

0 1 1

0 1 + 0

0 0 +

1 0 1 +

图1-4 1 位数的加法

(24)

第1 章 计算机的基本结构  ·  9

法规则将它加到 X 中。同样,如果实际结果是在 -2n-1到 +2n-1-1 的范围内,那么这个 结果将是用补码表示的代数运算的正确值。

b)二进制补码数的模为 16 的系统 N 2

N 1 0 1

2

0000 0001 0010

0011

0100

0101

0110 1000 0111

1001 1010 1011 1100

1101 1110

1111

1 + 1

2 +

3 +

4 +

5 + 6 7+ + 2

3

4

5

6 7 8

0

0000 0001 0010

0011

0100

0101

0110 1000 0111

1001 1010 1011 1100

1101 1110

1111

1 + 1

2 +

3 +

4 +

5 + 6 7+ + 2

3

4

5

6 7 8

0

a)整数模 N 的圆的表示

1-5 模数系统和补码系统

在图1-6 中给出了一些补码系统中加法和减法的例子。在所有这些 4 位数的例子中,结 果都在 -8 到 +7 的表示范围。当结果没有在表示范围之内时,便发生了算术溢出(arithmetic overflow)。这种情况将在后面的小节中讨论。图 1-6 中 a 到 d 四个加法运算符合加法规则,e 到j 六个减法运算符合减法规则。减法运算需要形成减数(算式中下面的值)的补码形式,不 论减数为正数还是负数,这个运算都是以完全相同的方式完成的。要得到一个数的补码形式,

需要对该数按位取反,然后加1。

利用补码表示法简化了有符号数的加法和减法运算,这就是现代计算机采用补码表示法 的理由。看起来似乎反码表示法与补码表示法一样有效,但是尽管数的求反很容易,可是加法 运算后得到的结果却不能保证总是正确的。进位 cn不能被忽略。如果 cn = 0,得到的结果是正 确的,如果 cn = 1,必须对这个结果加上 1,以保证它的正确性。这个必需的修正操作意味着 加法和减法运算在反码系统中不能像在补码系统中那样方便地实现。

3.符号扩展

我们经常需要用更多的位数来表示一个用一定位数给出的值。对于一个正数,用左边加0 的方法实现。对于一个用补码表示法表示的负数,最左边的位(表示数的符号)等于1,具有 同样值的较长位数的数可以通过在左边根据需要多次重复符号位来实现。为了理解为什么这样 做是正确的,考查图1-5b 中的模为 16 的圆。将它与比较大的圆,即模为 32 或模为 64 的情况 做比较,值 -1、-2 等的表示完全相同,只是用若干个 1 加到了左边。概要地说,在补码形式 中为了用更多的位数来表示一个有符号数,可以按照需要在左边多次重复它的符号位。这种操 作称为符号扩展(sign extension)。

4.整数算术运算中的溢出

使用补码表示法,n 位可表示的值在 -2n-1到 +2n-1-1 之间。例如,使用 4 位可以表示的 数的范围是 -8 到 +7,如图 1-3 所示。当算术运算的实际结果超出了这个表示范围时,就发生 了算术溢出。

当无符号数相加时,最高有效位上的进位输出1 表明发生了溢出。但是当对有符号数相 加时,这种方法并不总是正确的。比如,当使用补码表示4 位有符号数时,如果我们将 +7 和 +4 相加,和向量是 1011,它表示数值 -5,是一个不正确的结果。在这种情况下,从 MSB(最

13

(25)

高有效位)位置上得到的进位输出位是0。如果我们将 -4 和 -6 相加,得到 0110 = +6,也是 一个错误的结果。在这种情况下进位输出位为1。因此,从符号位得到的进位输出位的值不能 说明发生了溢出。显然,只有当两个加数有相同的符号时,才有可能产生溢出。具有不同符号 的数相加时不会产生溢出,因为结果总会保持在可以表示的范围之内。

1 0 1 1 1 1 1 0 1 0 0 1

1 1 0 1 1 0 0 1

0 0 1 0 0 1 0 0

0 1 1 0 0 0 1 1

1 0 0 1 1 0 1 1

1 0 0 1 0 0 0 1

0 0 1 0 1 1 0 1

1 1 1 0 0 1 0 0 1 0 1 0

0 1 1 1 1 1 0 1 0 1 0 0

1 1 0 1 0 1 1 1 0 1 0 0

0 0 1 0 1 1 0 0 1 1 1 0

0 1 1 0 1 1 0 1 0 0 1 1

1 0 0 1 0 1 0 1 1 1 1 0

1 0 0 1 1 1 1 1 1 0 0 0

0 0 1 0 0 0 1 1 0 1 0 1 0 1 0 1

0 0 1 0 0 0 1 1

5 ( )

2 + ( )

3 + ( )

5 (+ )

2 + ( )

4 (+ )

2 ( )

7 ( )

3 ( )

7 ( )

6 (+ )

3 + ( )

1 + ( )

7 ( )

5 ( )

7 ( )

2 (+ )

3 ( )

6 ( )

2 ( )

4 + ( )

3 ( )

4 + ( )

7 (+ )

4 + ( )

2 ( )

3 (+ )

2 ( )

8 ( )

5 + ( ) +

+ + + + + + +

+ +

a)

c)

b)

d)

e)

f )

g)

h)

i)

j)

1-6 补码的加法和减法运算

这样我们可以得出以下对两个补码表示的数相加时检测溢出的方法。测试两个加数的符

參考文獻

相關文件

MASS::lda(Y~.,data) Linear discriminant analysis MASS::qda(Y~.,data) Quadratic Discriminant Analysis class::knn(X,X,Y,k,prob) k-Nearest Neighbour(X 為變數資料;Y 為分類)

某項貨物的單位價格是指該項貨物的貿易貨值與其貨量之比。季度單位價格指數是計算當季各

某項貨物的單位價格是指該項貨物的貿易貨值與其貨量之比。季度單位價格指數是計算當季各

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季

某項貨物的單位價格是指該項貨物的貿易貨值與其貨量之比。季度單位價格指數是計算當季各

 虛線A構成一個自保回路。當X0 ON時,Y0 ON且自 保,此時縱使X0回復OFF狀態,Y0仍持續保持為ON..

之意,此指依照命令動作的意義。所謂伺服 系統,就是依照指示命令動作所構成的控制

(A)SQL 指令是關聯式資料庫的基本規格(B)只有 SQLServer 2000 支援 SQL 指令(C)SQL 指令 複雜難寫,適合程式進階者使用(D)是由 Oracle 發明的。.