《汇编程序设计与计算机体系结构:软件工程师教程》

举报
华章计算机 发表于 2019/12/03 16:40:52 2019/12/03
【摘要】 本节书摘来自华章计算机《汇编程序设计与计算机体系结构:软件工程师教程》一作者是布莱恩·R. 霍尔(Brian R. Hall)[美] 凯文·J.斯隆卡(Kevin J. Slonka),爱飞翔 译。

计算机科学丛书

汇编程序设计与计算机体系结构:软件工程师教程

Assembly Programming and Computer Architecture for Software Engineers

1575362235917113.jpg


布莱恩·R. 霍尔(Brian R. Hall)

[美] 凯文·J.斯隆卡(Kevin J. Slonka) 著

爱飞翔 译

 

 

 


 

出版者的话

Assembly Programming and Computer Architecture for Software Engineers

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

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

机械工业出版社华章公司较早意识到“出版要为教育服务”。自1998年开始,我们就将工作重点放在了遴选、移译国外优秀教材上。经过多年的不懈努力,我们与Pearson、McGraw-Hill、Elsevier、MIT、John Wiley & Sons、Cengage等世界著名出版公司建立了良好的合作关系,从它们现有的数百种教材中甄选出Andrew S. Tanenbaum、Bjarne Stroustrup、Brian 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等大师名家的一批经典作品,以“计算机科学丛书”为总称出版,供读者学习、研究及珍藏。大理石纹理的封面,也正体现了这套丛书的品位和格调。

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

权威的作者、经典的教材、一流的译者、严格的审校、精细的编辑,这些因素使我们的图书有了质量的保证。随着计算机科学与技术专业学科建设的不断完善和教材改革的逐渐深化,教育界对国外计算机教材的需求和应用都将步入一个新的阶段,我们的目标是尽善尽美,而反馈的意见正是我们达到这一终极目标的重要帮助。华章公司欢迎老师和读者对我们的工作提出建议或给予指正,我们的联系方法如下:

华章网站:www.hzbook.com

电子邮件:hzjsj@hzbook.com

联系电话:(010)88379604

联系地址:北京市西城区百万庄南街1号

邮政编码:100037

 

 

 

译 者 序

Assembly Programming and Computer Architecture for Software Engineers

这是一本从汇编语言入手讲解计算机系统结构的书。谈起编程语言,你首先可能会想到一些常见的高级语言,尤其是功能比较多、写起来又很方便的高级语言。它们提供的抽象机制使开发者不用担心操作系统乃至底层硬件的细节,能够专注于应用层面的逻辑。

可是,如果过度依赖这种抽象机制,就会对程序的工作原理尤其是它在操作系统及底层硬件中的运作方式渐渐陌生。然而一些重要的开发环节,例如调试、测试、优化等,却正需要开发者了解这些原理及运作方式,这样才能节省时间并提高效率。

从应用的角度讲,学习汇编语言,或许并不是为了把整个项目都用汇编指令去写,而是为了能够在某些关键的地方采用插入内联式汇编代码等手法来利用处理器的特性,从而更加灵活地实现软件的需求。此外,调试及测试程序时,也可以通过高级语言与汇编指令之间的对应关系来把握程序的运行状况,从而更为迅速地找到错误,或发现那些可以继续优化的地方。了解汇编语言,还可以帮助你从编译后的机器码入手,研究各种编译选项对程序的运行效率及效果所产生的影响。

本书通过大量实例,循序渐进地讲解了汇编语言的各种应用方式,并直观地演示了怎样把汇编语言同高级语言结合,以制作出充分发挥硬件特性的程序。书中内容以 x86 与 x86_64 这两种主流架构为重点,兼顾 AT&T 及 Intel 语法,并适用于 GAS、NASM 与 MASM 这三种常见的汇编器,以及 Linux、macOS 与 Windows 这三种常用的操作系统,这使得身处各种开发环境中的软件工程师都能在书里找到可以直接运用的解决方案,并了解如何将其移植到其他环境。

翻译本书的过程中,得到了机械工业出版社华章公司诸位编辑与工作人员的帮助,在此深表感谢。

由于译者水平有限,错误与疏漏之处,请大家发邮件至  eastarstormlee@gmail.com,或访问 github.com/jeffreybaoshenlee/apcase-errata/issues 留言,给我以批评和指教。

 

爱飞翔

2018年8月9日

 

 

 

 

 

前  言

Assembly Programming and Computer Architecture for Software Engineers

本书的目标

这是一本讲解汇编语言与计算机体系结构的教材。笔者从实用的角度出发讲解相关的原理与技术。首先介绍计算机编程语言和体系结构的基础知识,然后详细讨论汇编语言,并以此为手段,帮助读者更好地理解计算机的体系结构以及汇编语言在软件开发工作中的用途。

现有的计算机体系结构教程有这样几个缺点:(1)书里所讲的体系结构不是业界的主流;(2)书的写法更适合学习计算机与电气工程专业的人阅读,而不适合学习计算机科学专业的人及软件工程师阅读;(3)书里只讲与某个具体的操作系统有关的开发环境;(4) 定价过高;(5) 缺乏实用的内容。笔者想为大家提供一本更好的教材。

本书所面向的读者

本书主要面向计算机科学及软件工程专业的大学生。阅读本书之前,应该先学习计算机入门课程并打下良好的编程基础。你至少要掌握数据结构,而且最好是从 C/C++ 语言的角度学习过数据结构。已经工作的人也能从这本书里发现很多有用的话题,你可以据此来自学,以提高编写底层代码与高级代码的水平。

本书的编写过程及学习方法

从事学术工作的过程中,笔者经常冒出写书的念头,其中很多想法都源自我们两个人所讲的课程,也就是计算机体系结构。几十年来,这门课一直是计算机科学与软件工程专业的重要内容。此外,我们也开设了一些更偏向于实用技术的课程。

读博士的时候,我们曾经随口说要合写一本书,但一直没动笔。现在,总算找到了可以写这样一本书的机会。写书要花很多工夫,而且需要相互协作。笔者教了多年的计算机体系结构课程,并且一直在与 Prospect出版社的合作伙伴 Beth Golub 讨论相关的想法,最后,大家形成了一套颇为独特的理念,并打算以此为基础,写一本面向教师、学生与 IT 从业者的计算机体系结构教程,同时克服前面所说的缺点。也就是说,我们要写的这本书应该基于主流的体系结构,面向学习计算机科学专业的人及软件工程师,适合多种开发环境,定价要合理,而且内容也要实用。

确定了这个理念之后,我们开始用大量的时间撰写本书,这其中有许多时间花在了程序代码上。用汇编语言写代码是相当曲折的,但正因为如此也总能吸引我们去挑战。你会在学习过程中慢慢地体会到这种乐趣。想要把汇编语言与计算机体系结构这样一个复杂的话题写得简洁而清晰是很难的,而且其中哪些方面应该涵盖、哪些方面应该舍弃也不太容易决定,此外还要考虑如何安排讲解的顺序。这些都是撰写计算机书籍时经常遇到的问题。

对于许多学习计算机的人来说,通过汇编语言切入计算机体系结构是个特别好的方法,而且在用这种方法学习体系结构的过程中,你还能掌握实用的编程技巧。所以说,按照这种学习方法写出来的书,很适合用作相关课程的教材,而且也颇受学校、教师及学生的欢迎。我们认为汇编语言与计算机体系结构这门课讲起来很有意思,想要通过本书把这些有趣的知识分享给大家,希望你也能和我们一样喜欢这些内容。

内容编排及各章目标

第 1 章与第 2 章,讲解计算机编程语言与计算机体系结构的基础知识。

第 3 章至第 5 章,介绍 x86 与 x86_64 的汇编语法以及各种指令。

第 6 章至第 8 章,讲解函数、结构体以及浮点数运算等更为复杂的话题。

第 9 章与第 10 章,讲解怎样把汇编与高级语言及系统软件结合起来使用,并讲解与计算机及体系结构有关的其他高级话题。

第 11 章讲解 x86 之外的其他架构。

第 12 章介绍硬件及其元件的基本原理。

各章目标

第 1 章:描述计算机语言的翻译流程

第 2 章:了解计算机与处理器的各个组成部分

第 3 章:知道各种汇编器在语法上的区别

第 4 章:执行基本的算术运算

第 5 章:控制程序的流程

第 6 章:按照约定来调用函数

第 7 章:使用字符串与结构体

第 8 章:执行浮点运算

第 9 章:整合底层代码与高级代码

第 10 章:发起系统调用

第 11 章:对比各种计算机架构

第 12 章:构建简单的电路与设备

补充材料

本书有 4 组补充材料,分别位于第 1 章与第 2 章之后,以及第 6 章、第 8 章、第 10 章之后,其中包含与对应章有关的程序及内容。

附录

本书共有 9 个附录。在附录的前面有一篇总的简介,用来描述这些附录的内容。这些附录分别提供了与下列 9 个方面有关的实用信息:汇编语言的语法、开发环境的配置、反汇编、调试、汇编代码与 C++ 代码的链接、调用函数时所需遵循的约定、CPUID 的用法、十进制与 ASCII 算术、内部函数。

学习资源

本书网站:http://www.prospectpressvt.com/titles/hall-assembly-programming/

本书源代码:https://github.com/brianrhall/Assembly

教师资源:http://prospectpressvt.com/titles/hall-assembly-programming/instructor-resources/

学生资源:http://prospectpressvt.com/titles/hall-assembly-programming/student-resources/

作者 Brian 的网站:http://www.brianrhall.net

作者 Kevin 的网站:http://www.kevinslonka.com

与某些具体内容有关的资源,请参阅各附录以及位于所有附录之前的简介。此外,每章开头的网络资源也包含相关的链接。

致谢

这本书能够问世得益于很多人的帮助,我们对此深表谢意。感谢诸位老师把我们带入这个领域。感谢 Beth Golub 给我们提供机会,令我们能够与 Prospect 出版社合作出版这本书,并感谢她在我们写书的过程中给予指导。感谢以下诸位审阅者抽出时间给我们提供宝贵的意见:

印第安纳大学东南分校的 John Doyle

阿肯色州立大学的 Hai Jiang

安大略理工大学的 Saad Khattak

威斯康星大学帕克塞德分校的 Susan Lincke

洛约拉马利蒙特大学的 Ray Toal

感谢诸位同事与学生在过去两年里为我们写作本书提供了很多便利。最后,尤其感谢我们的家人愿意拿出本来应该共处的时间让我们写书。Brian 要感谢 Narine 与 Aven,Kevin 要感谢未婚妻 Kelli,这本书能够写成,离不开你们的付出。

 

 

 

 

目  录

Assembly Programming and Computer Architecture for Software Engineers


出版者的话

译者序

前言

第1章 编程语言及数据的

基础知识  1

1.1 开篇语  1

1.2 简介  3

1.3 计算机编程语言  3

1.3.1 语言之间的关系  3

1.3.2 翻译流水线  3

1.3.3 编程语言与相应文件及编程工具之间的关系  6

1.3.4 为什么要学习汇编语言  7

1.4 数据的表示  8

1.4.1 计数系统  8

1.4.2 怎样表示整数  8

1.4.3 怎样表示无符号的整数  9

1.4.4 怎样表示带符号的整数  12

1.4.5 怎样保存字符  14

1.5 布尔表达式  16

1.6 3位计算机示例  17

1.7 小结  18

1.8 关键术语  18

1.9 代码回顾  19

1.10 习题  20

1.11 作业  21

第2章 处理器与计算机系统体系结构  22

2.1 简介  22

2.2 体系结构概述  22

2.3 处理器  26

2.3.1 缓存与寄存器  27

2.3.2 64 位处理器  31

2.3.3 指令的执行  31

2.3.4 指令流水线  32

2.4 输入与输出  33

2.5 小结  35

2.6 关键术语  35

2.7 习题  36

2.8 作业  37

第1章与第2章补充材料 与体系结构有关的更多细节  38

第3章 汇编语言及其语法的基础知识  41

3.1 简介  41

3.2 基本元素  42

3.2.1 汇编代码的五大支柱  42

3.2.2 字面量  46

3.2.3 标签与注释  48

3.3 定义数据  49

3.4 写出能够正常运行的范例程序  55

3.5 小结  56

3.6 关键术语  56

3.7 代码回顾  57

3.8 习题  57

3.9 作业  58

第4章 基本指令  60

4.1 简介  60

4.2 数据的移动与算术运算  61

4.2.1 移动数据  61

4.2.2 加法与减法  62

4.2.3 乘法与除法  64

4.2.4 移位  69

4.2.5 处理负值  71

4.3 数据的寻址与传输  72

4.3.1 数据对齐  72

4.3.2 数据寻址  73

4.3.3 数组  75

4.3.4 改变数据的大小及类型  78

4.4 小结  79

4.5 关键术语  80

4.6 代码回顾  80

4.7 习题  81

4.8 作业  81

第 5 章 中级指令  83

5.1 简介  83

5.2 按位执行的布尔运算  83

5.3 分支  88

5.3.1 无条件跳转  88

5.3.2 有条件跳转  88

5.3.3 复合条件  91

5.4 重复执行  92

5.4.1 用 CX/ECX/RCX 计数器实现循环  92

5.4.2 用开发者自定义的计数器实现循环  94

5.5 小结  97

5.6 关键术语  97

5.7 代码回顾  97

5.8 习题  98

5.9 作业  99

第 6 章 函数  100

6.1 简介  100

6.2 栈内存入门  100

6.3 x86 与 x86_64 的调用约定  101

6.3.1 cdecl(32 位)  102

6.3.2 stdcall(32 位)  109

6.3.3 x86_64(64 位)  110

6.3.4 有用的细节  114

6.4 实现  114

6.5 小结  118

6.6 关键术语  118

6.7 重要的寄存器(32 位和

64 位)  118

6.8 代码回顾  119

6.9 与平台有关的注意事项  119

6.10 习题  120

6.11 作业  120

第6章补充材料 程序 6-3  122

第7章 与字符串有关的指令及结构体  123

7.1 简介  123

7.2 辅助指令  123

7.3 基本字符串指令  125

7.3.1 MOVS  125

7.3.2 CMPS  126

7.3.3 SCAS  129

7.3.4 STOS  131

7.3.5 LODS  132

7.4 结构体  133

7.5 小结  135

7.6 关键术语  135

7.7 代码回顾  135

7.8 习题  136

7.9 作业  137

第8章 浮点运算  138

8.1 简介  138

8.2 浮点数的表示方式  139

8.2.1 IEEE表示法  139

8.2.2 特殊值  141

8.2.3 次正规数  141

8.2.4 舍入  142

8.3 浮点数的实现  143

8.3.1 x87  143

8.3.2 MMX——题外话  152

8.3.3 SSE  154

8.3.4 XOP、FMA3/4、F16C——分化  159

8.3.5 AVX  160

8.4 小结  161

8.5 关键术语  162

8.6 重要的寄存器(32位和64位)  162

8.7 代码回顾  162

8.8 习题  164

8.9 作业  165

第8章补充材料 第8章中的程序  167

第9章 内联汇编与宏  177

9.1 简介  177

9.2 内联汇编  177

9.2.1 与编译器有关的细节  178

9.2.2 内联式的汇编语句  178

9.2.3 为各种汇编方言提供支持  184

9.2.4 注意事项  185

9.3 宏  186

9.3.1 对比宏与函数  186

9.3.2 定义并调用宏  186

9.4 小结  188

9.5 关键术语  188

9.6 习题  188

9.7 作业  189

第10章 与处理器及体系结构有关的高级话题  191

10.1 简介  191

10.2 处理器与系统的机能  192

10.2.1 系统寄存器  192

10.2.2 处理器模式  193

10.2.3 内存模型  193

10.2.4 代码范例  197

10.3 中断与系统调用  198

10.3.1 软件中断  198

10.3.2 硬件中断  204

10.3.3 通过INT进行系统调用(旧方法)  204

10.3.4 通过SYSENTER、SYSCALL及程序库/API进行系统调用(新方法)  207

10.4 小结  214

10.5 关键术语  215

10.6 代码回顾  216

10.7 习题  216

10.8 作业  217

第10章补充材料 第10章中的程序和资源  218

第11章 其他架构  223

11.1 简介  223

11.2 CISC与RISC  224

11.3 更多架构  225

11.3.1 ARM  225

11.3.2 AVR  228

11.3.3 RISC-V  231

11.3.4 System-z/Architecture  233

11.4 量子架构  234

11.5 小结  236

11.6 关键术语  236

11.7 习题  236

11.8 作业  237

第12章 硬件与电子元件  239

12.1 简介  239

12.2 电学基础  239

12.2.1 基本的物理量  239

12.2.2 交流与直流  241

12.3 电子元件  242

12.3.1 供电设备  242

12.3.2 电阻器  244

12.3.3 二极管  245

12.3.4 电容器  245

12.3.5 晶体管  245

12.4 集成电路  246

12.5 常见的实现产品  247

12.5.1 计算机处理器  247

12.5.2 Raspberry Pi  247

12.5.3 Apple iPhone与Apple Watch  248

12.6 小结  248

12.7 关键术语  248

12.8 习题  249

12.9 作业  250

附录简介  251

附录A 各种汇编语法之间的对应关系  253

附录B 为汇编语言配置开发环境  256

附录C 反汇编  261

附录D 用GDB工具调试汇编程序  268

附录E 链接汇编代码及C++代码  273

附录F 函数与栈  278

附录G CPUID指令的用法  282

附录H ASCII和十进制算术运算  289

附录I 编译器内部函数  293


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。