深入理解程序设计:使用Linux汇编语言.pdf

深入理解程序设计:使用Linux汇编语言.pdf
 

书籍描述

编辑推荐
世界最优秀的计算机科学专业学生都在用的编程教材
一朝掌握汇编语言,终生理解计算机的思考与行为方式
语言轻松,例子实用,轻松学会用Linux汇编语言编程

媒体推荐
“程序员不了解CPU的工作方式,就好比行医之人不懂解剖学,只能取得有限的成功。我强力推荐本书,即使你从不用汇编语言编程!……它必将成为你的灵感之源,助力你提高编程技能。”
——《软件随想录》作者Joel Spolsky
JoelOnSoftware.com
“这本书是我们系统编程课的教材,其内容组织与阐释非常棒,尤其是关于底层内存管理那部分。你还在为不理解calloc和malloc的工作方式而苦恼吗?不妨看一下其中编写基本内存管理程序的汇编代码。另外,本书很好地介绍了gcc编译器和IA-32架构,因此拥有一个英特尔处理器和一个Linux分区,你便可运行示例及自编程序!”
“我看了很多Linux平台汇编语言编程的书,本书是我的最爱(实在没有多少书能与其竞争)!一直听说汇编语言令人费解,这本书却让我发现它是多么容易。我没有任何用汇编语言编程的意图,但了解了基础知识之后,我对高级语言代码的编译过程有了更好的理解和认识,而且终于搞懂了指针以及堆与栈的区别!”
——亚马逊读者评论

作者简介
Jonathan Bartlett
New Medio技术总监,负责为各公司定制Web应用、移动应用或企业软件解决方案。在此之前,他曾在EDS担任因特网开发经理一职,为Web团队和Wolfram Research提供技术支持。另外,他常在IBM DeveloperWorks社区撰文,介绍从高性能Playstation 3编程到高级元编程技巧等主题。

目录
目 录

第1章 引言  1
1.1  欢迎加入编程大军  1
1.2  工具  2
第2章 计算机体系结构  5
2.1  内存结构  5
2.2  CPU构造  6
2.3  几个术语  7
2.4  内存详解  9
2.5  寻址方式  10
2.6  温故知新  11
2.6.1  理解概念  11
2.6.2  应用概念  11
2.6.3  深入学习  12
第3章 编写第一个程序  13
3.1  编程初体验  13
3.2  汇编语言程序概要  15
3.3  为程序做规划  19
3.4  查找最大值  21
3.5  寻址方式  27
3.6  温故知新  30
3.6.1  理解概念  30
3.6.2  应用概念  30
3.6.3  深入学习  31
第4章 关于函数  32
4.1  处理复杂度  32
4.2  函数的工作原理  33
4.3  使用C调用约定的汇编语言函数  34
4.4  函数示例  38
4.5  递归函数  41
4.6  温故知新  46
4.6.1  理解概念  46
4.6.2  应用概念  47
4.6.3  深入学习  47
第5章 文件处理  48
5.1  UNIX文件的概念  48
5.2  缓冲区和.bss  49
5.3  标准文件和特殊文件  50
5.4  在程序中使用文件  51
5.5  温故知新  60
5.5.1  理解概念  60
5.5.2  应用概念  61
5.5.3  深入学习  61
第6章 读写简单记录  62
6.1  写入记录  65
6.2  读取记录  69
6.3  修改记录  73
6.4  温故知新  76
6.4.1  理解概念  76
6.4.2  应用概念  76
6.4.3  深入学习  76
第7章 开发健壮的程序  77
7.1  将时间用在何处  77
7.2  开发健壮程序的技巧  78
7.2.1  用户测试  78
7.2.2  数据测试  78
7.2.3  模块测试  79
7.3  有效处理错误  80
7.3.1  万能的错误处理代码  80
7.3.2  恢复点  80
7.4  让程序更健壮  81
7.5  温故知新  83
7.5.1  理解概念  83
7.5.2  应用概念  83
7.5.3  深入学习  83
第8章 与代码库共享程序  84
8.1  使用共享库  85
8.2  共享库的工作原理  86
8.3  查找关于库的信息  87
8.4  一些有用的函数  91
8.5  构建一个共享库  92
8.6  温故知新  93
8.6.1  理解概念  93
8.6.2  应用概念  94
8.6.3  深入学习  94
第9章 关于中间存储器  95
9.1  计算机如何看待内存  95
9.2  Linux程序的内存布局  96
9.3  每个内存地址都是虚拟的  98
9.4  获取更多的内存  100
9.5  一个简单的内存管理器  101
9.5.1  变量和常量  106
9.5.2  性能问题及其他  111
9.6  使用我们的分配器  112
9.7  更多信息  114
9.8  温故知新  114
9.8.1  理解概念  114
9.8.2  应用概念  114
9.8.3  深入学习  115
第10章 像计算机一样计数  116
10.1  计数  116
10.1.1  像人类一样计数  116
10.1.2  像计算机一样计数  117
10.1.3  二进制和十进制之间的转换  118
10.2  真假和二进制数  120
10.3  程序状态寄存器  126
10.4  其他计数系统  127
10.4.1  浮点数  127
10.4.2  负数  128
10.5  八进制和十六进制数字  129
10.6  一个字中的字节顺序  130
10.7  将数字转换成字符显示  131
10.8  温故知新  135
10.8.1  理解概念  135
10.8.2  应用概念  136
10.8.3  深入学习  136
第11章 高级语言  137
11.1  编译语言和解释语言  137
11.2  第一个C程序  138
11.3  Perl  140
11.4  Python  141
11.5  温故知新  141
11.5.1  理解概念  141
11.5.2  应用概念  141
11.5.3  深入学习  142
第12章 优化  143
12.1  何时优化  143
12.2  优化何处  144
12.3  局部优化  145
12.4  全局优化  146
12.5  温故知新  147
12.5.1  理解概念  147
12.5.2  应用概念  148
12.5.3  深入学习  148
第13章 学无止境  149
13.1  自下而上  150
13.2  自顶向下  150
13.3  从中间开始  150
13.4  专题  151
13.5  汇编语言的更多资源  152
附录A  GUI编程  153
附录B  通用x86指令  165
附录C  重要的系统调用  172
附录D  ASCII码  174
附录E  汇编语言中的常用C语句  175
附录F  使用GDB调试器  183
附录G  文档历史  189
附录H  GNU自由文档许可协议  190
附录I  致谢  196
索引  197

序言
【引言】

1.1 欢迎加入编程大军
我热爱编程,编写不但能运行而且风格良好的程序是我最喜欢的挑战。编程如同写诗。它不仅是向计算机传递信息,也是向修改和使用程序的人传递信息。有了程序,你就能用一套规则构建自己的世界,按自己对问题的理解和自己构思的解决方案来创造自己的世界。高明的程序员可以用诗篇或散文般简明的程序来构建世界。
作为最伟大的程序员之一,Donald Knuth这样向我们描述编程:编程并非告诉计算机如何做某件事,而是告诉人们程序员如何指示计算机做某件事。这里的关键在于:程序不仅仅是给计算机看的,更是给人看的。当你转向其他项目后,你的程序将由其他人修改和更新。因此,编程并非只需要和计算机交流,更意味着要和接替你的程序员沟通。程序员不仅是问题的解决者,同时也是诗人和教师。作为程序员,你的目标是以协调、优雅的方式解决手边的问题,并把自己的解决方案传授给未来的程序员。希望本书至少能有这个荣幸:向你传授一些让使用计算机变得令人兴奋的诗意和魔力。
多数入门编程书籍让我感到非常失望。读完这类书之后,我们仍然会问“计算机到底是怎么工作的”,并且不能获得圆满的答案。这些书遇到那些艰深的主题往往就语焉不详,即使这些主题非常重要。在本书中,我将会引导你理解这些难懂的问题,因为这是成为编程高手的唯一途径。我的目标是让那些对编程一无所知的人懂得如何像程序员那样思考、编程和学习。当然,读过本书之后,你不可能掌握与编程有关的一切,但将会对所有这一切是如何相互配合的有所了解。认真阅读本书后,你应该能够做到以下几点:
了解程序的工作原理以及一个程序如何与其他程序交互;
学会阅读他人的程序并了解其工作原理;
快速学习新的编程语言;
快速学习先进的计算机科学概念。
当然,我无法在这本书中将与编程有关的一切传授给你。因为计算机科学是个宽广的领域,尤其在涉及计算机编程理论与实践相结合时更是如此。然而,我会尝试让你打好基础,这样,以后你就能比较容易地向任何感兴趣的方向发展。
教授编程特别是汇编语言编程,与“先有鸡还是先有蛋”的问题颇有几分类似。在这里,有很多东西需要学习,要马上学会这一切确实有点勉为其难。但由于各部分知识是相互联系的,所以学习编程时,你只要一以贯之地耐心对待你自己和计算机,就会较快地学有所成。在学习本书的过程中,对第一次阅读时未能理解的内容,请再读一遍。如果仍然不明白,也许暂时记住它,稍后再去回顾和理解会更好。因为通常情况下,必须在对编程有更多接触后,那些概念才会变得更易理解。不要气馁,这个过程尽管漫长而艰难,但一切努力都是值得的。
本书每章的末尾都有三组复习题:第一组用于回想,检查你是否记得在该章学到的知识;第二组涉及实际应用,检验你是否能运用学到的知识解决问题;最后一组是为了检验你能否拓展视野、举一反三。最后一组题目中的有些问题要等学习了后面的章节才能回答,但它们会让你带着问题学习后续的内容。有些问题需要研究本书之外的资料才能找到答案,还有一些问题要求简单分析你的选择,对最佳方案加以说明。需要指出的是,许多问题的答案并无对错之分,但这并不意味着它们不重要。学习编程中所涉及的问题、学习如何通过调研找到答案、学习编程时如何考虑未来的变数,这些都是程序员工作的重要组成部分。
如果有实在无法解答的问题,读者可借助本书的邮件列表pgubook-readers@nongnu.org讨论书中内容并获得帮助。(通过此邮件列表,读者可提出与本书有关的任何问题。)你可以通过访问http://mail.nongnu.org/mailman/listinfo/pgubook-readers来订阅此列表。
1.2 工具
本书讲解基于x86处理器和GNU/Linux操作系统的汇编语言,因此我们给出的所有例子都使用GNU/Linux标准的GCC工具集。如果你不熟悉GNU/ Linux和GCC工具集,可以阅读本书后面的简单介绍。如果你是Linux新手,请查阅http://rute.sourceforge.net提供的指南 。本书的目的主要是向读者展示如何编程,而不是如何在某个特定平台上使用特定的工具集。当然,统一使用一个平台和工具集,会使本书的描述变得较为简单。
Linux新手应努力加入当地的GNU/Linux用户组。用户组的老成员通常乐于帮助新人,他们会为新手提供全面帮助,从安装Linux系统到学习如何最有效地使用Linux。GNU/Linux用户组列表可在http://www.linux.org/groups获得。
本书所有程序都已用Red Hat Linux 8.0进行了测试,同时也能运行于其他GNU/Linux版本上 。虽然本书程序无法运行在BSD等非Linux操作系统上,但在本书中学到的编程方法和技能,在其他任何系统上都是通用的。
如果没有安装了GNU/Linux系统的机器,读者可以找一个提供Linux shell账号(shell是Linux系统的命令行界面)的托管服务提供商。有很多低价的shell账号供应商,但你必须确保他们提供的是x86上的Linux系统服务。此外,你当地GNU/Linux用户组的人或许也能给你一个shell账号。只要能上网,通过telnet程序就可以使用你的shell账号。如果你使用的是Windows系统,单击“开始”→“运行”,再键入telnet即可。但因为Windows自带的telnet存在一些奇怪的问题,所以最好从http://www.chiart.greenend.co.uk/~sgtatham/putty/下载PuTTY程序。使用Macintosh系统的读者也有许多选择,NiftyTelnet就是我最喜欢用的程序。
如果没有GNU/Linux系统,也无法获得shell账号服务,那么可从http://www.knoppix.org/下载Knoppix。Knoppix是从CD引导的GNU/Linux 版本,无需进行安装。使用完毕后,只需重新启动系统并移除CD,即可回到你的常用操作系统。
说了这么多,GNU/Linux到底是什么呢?简而言之,GNU/Linux是仿照UNIX开发的操作系统。GNU/Linux的GNU部分来自GNU项目(参见http://www.gnu.org/) ,由包含GCC工具集在内的绝大多数Linux程序组成。GCC工具集包含了编写多种计算机语言程序所需的全部开发工具。
GNU/Linux中的Linux是操作系统内核的名称。内核是操作系统的核心部分,掌控系统的一切活动。可以把内核看成是系统的大门和围墙。作为大门,内核使程序以统一的方式访问硬件。如果没有内核,你就得自行编写程序才能操作所有设备。内核帮我们处理与具体设备的所有交互,我们就可以不用去操心这些事了。内核也处理文件访问以及进程间交互。例如,你从键盘输入的内容要经过以下几个步骤才会到达编辑器:首先,掌管硬件设备的内核接收到按键通知,键盘发送扫描码到内核;然后,内核将这些扫描码转换为实际对应的字母、数字或符号;最后,如果你使用的是窗口操作系统(如Microsoft Windows或X Window系统),窗口系统会从内核读取按键,并发送给用户显示器上获得了焦点的程序。
示例1-1 计算机如何处理键盘信号
键盘 -> 内核 -> 窗口系统 -> 应用程序
内核也控制着程序之间的信息流。内核是程序通往周边世界的大门,控制着数据在进程间传递时的消息收发。在上面的示例中,窗口系统要将按键传递给应用程序,就离不开内核的参与。
作为“围墙”,内核会阻止程序意外覆盖其他程序的数据或访问其无权访问的文件和设备。内核的这些功能可减轻写得不好的程序给其他正在运行的程序造成的危害。
在本书中,内核就是Linux。但我们知道,只有内核什么也做不了,连启动计算机都不行。说得形象一点儿,可以把内核设想成屋里的水管:如果没有水管,水龙头就无法工作;但没有水龙头,水管也毫无用处。因此,完整的GNU/Linux操作系统是由用户应用程序(来自GNU项目及其他地方)和内核(Linux)共同构成的。
计算机语言一般分为以下三类,本书主要讲述较低级的汇编语言。
机器语言
机器语言是计算机可直接识别和处理的语言。在机器语言中,计算机能识别的每条命令都以数字或数字串的形式给出。
汇编语言
除了用易于记忆的字母序列代替数字命令外,汇编语言与机器语言差不多,另外还添加了一些便捷的辅助语法。
高级语言
高级语言旨在使编程更容易。汇编语言要求你工作时面向机器本身,而高级语言则让你以更接近自然语言的形式来表述程序。高级语言的一条命令,往往相当于汇编语言的几条命令。
在本书中,我们将主要学习汇编语言,但对高级语言也稍有涉猎。希望通过学习汇编语言,你能理解程序和计算机的工作原理,从而在编程之路上迈出一大步。

文摘
引言

内容简介
是否真正理解汇编语言,常常是普通程序员和优秀程序员的分水岭。《深入理解程序设计:使用Linux汇编语言》介绍了Linux平台下的汇编语言编程,教你从计算机的角度看问题,从而了解汇编语言及计算机的工作方式,为成就自己的优秀程序员之梦夯实基础。
很多人都认为汇编语言晦涩难懂,但New Medio技术总监Jonathan Bartlett的这本书将改变人们的看法。本书首先介绍计算机的体系结构,然后从编写简单程序开始,一步一步扩充函数、文件、读写处理等知识,并平滑过渡到程序共享、存储与优化,由浅入深地介绍了Linux汇编语言编程。作者不仅会带你了解向计算机传递信息的方式方法,还让你学会向修改和使用程序的人传递信息,并最终用自己的规则构建“世界”,按自己对问题的理解和解决方案创造“世界”。
主要内容:
计算机体系结构(详解内存及寻址方式);
编程初体验;
函数使用及复杂度处理;
文件处理及缓冲区分析;
记录读写及修改;
通过测试及错误处理打造健壮程序;
程序共享;
内存布局及处理;
计算机的计数原理;
程序优化(时机、位置及方式)。

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多