世界的规则――给小牛同学的汇编语言推荐书
今天中午一醒,看到小牛同学的短信,希望我帮他推荐汇编语言的书,还指明是
X86体系的。
其实,想找X86以外的,我也只听说过AT&T体系,就是Linux用的这套,别的完全
不清楚。
想着是哪几本对我最有影响,哪几本听说最好,入了神。如烟往事,全都浮现上
来。回忆一下汇编语言吧,也顺便怀念一下与汇编一起出现的朋友。
一 学汇编有什么用
恐怕不少同学会有这样的疑问。这是C#,是J2EE的时代,是乱七八糟很多新名词
的时代。很多同学都问过这样的问题:为什么我们要学习那些落后的过时的东西。
因为汇编语言这种基础的技能,一直也没有过时。而且,它有很多别的用途。
就像朋友不能现用现交,想跟人借笔记的时候给人买冰棍,知识也是一样。无论
从事计算机的哪个领域,只要不是打字或者单纯WORD排版,汇编--不仅如此--的
知识总是可以帮助你。
当年我打游戏的时候喜欢改。英雄无敌II,三国群英传 是改得比较透彻的。英
雄无敌里,经常带着9999条黑龙,据介绍是不喜欢群居的动物,有强大的物理攻
击力,似乎还对魔法免疫,我常带着这么一大群黑龙,跑遍地图,遇神杀神,所
向无敌。三国群英传,大哥玩得比较多,通关无数遍。我主要负责替他把所有的
宝物都调出来。某马某剑某书,之类的。
刘青华同学说,你这么玩就没意思了啊。大致意思是,游戏玩的就是挑战么。确
实,这些游戏改了以后,在我看来也淡而无味。但是我所享受的,不是游戏本身
的乐起,而正在于改。
改游戏,锻炼了我对数据段的理解。数据段,正是汇编语言这门课的一个知识
点,涉及到数据以何种格式在内存中存储。大多数游戏都是int型,只有帝国时
代是个例外,是float型。
后来破解游戏。就是那种运行的时候需要光盘或者注册码的。注册码和补丁那个
时候还不太好找,所以需要自己动手。soft-ice就是那个时候学会的,bpx,bpe
这样的指令,到现在还没有忘。前一段时间写驱动的时候用到,完全想不起来
了,正感慨,结果一走神的时候,发现指令已经上屏了,手指比大脑记得更牢固。
破解游戏需要用到windows api和汇编的函数调用和出口,也涉及到各寄存器和
寻址方式。这全面的锻炼了汇编语言。
我推荐的书中,罗云彬先生 就是以破解入手,后来汇编颇有心得。
学汇编当然不是为了改游戏和破解软件。它的作用在于,我们可以深入理解C或者
其他高级语言所生成的代码--底层的体系是什么样的,可以调用哪些机制,为什
么会有这样的限制,等等。
为什么C语言会是今天的这个样子,或者说,为什么像C语言这样的语言为什么可
以流行很多年,答案需要你学习了汇编语言才能理解。
我们很容易向一个人描述什么是 红色。光谱为630-740nm的光就是红光,红光的
颜色就是红色。但是,除非你有视觉,能够亲眼看到红色,否则你永远也不知道
看到红色那是什么感觉。汇编语言作为基础对于计算机工程师的影响也是这样。
你尽可以听我描述它是如何重要,如何构成了计算机硬件和软件的桥梁,如何限
定了软件的功能,也提供给软件基础。但是这都白扯,亲身的体会,写汇编的经
验,是上述文字不能替代的。
如果想了解我说的这种感觉,只有成为我。好在,在这一方面成为我并不困难,
学习汇编语言就可以了。
IBM-PC汇编语言程序设计(第1版)
http://book.douban.com/subject/1012809/
上面这本是我主要学习的,可能是我们教材,不太记得了。现在有第二版了,还
有一本清华的,作者是王爽。 我都没看过,没法评价。刚刚提到的这本,写得
挺明白的,也简单。
汇编语言编程艺术
http://book.douban.com/subject/1231288/
这本很多牛人说好,我也没看过。
Intel微处理器
http://book.douban.com/subject/4872461/
这本挺厚,也挺好。看着有点硬,那正是汇编以下的基础。
再往后,就可以学习 接口 相关的内容了。
二 有时候,汇编确实没有用
当年两位师兄说,那些都是扯淡。他们指的就是汇编。一位是唐猛,他去了哈尔
滨的啥学校。毕业以后回来一次,跟我喝酒。彼时我还能喝点,被他灌得不行。
后来就渺无消息了。他当年对于我指出他的学校不重视他的答复是:我会汇编,
人家不需要汇编,那有啥用。
另一位师兄是付彤。他去了附中工作,现在干得也好。他刚去的时候,我问,你
计算机好,有用吧。他说:没用,他的师兄问他的,唯一与计算机水平相关的就
是 你打字快不。除了打字快,别的都没用。当然,后来付师兄还组织和参加各
种计算机相关的比赛,用到的应该不只是打字。
这种情况可能有一些同学也会遇到。汇编语言真的有用么?
是的,它不能帮你倒杯水,也不能帮你把转身而去的女孩拦住。如果说,有用指
这个的话,世界上只有暴力是有用的,你可以随时利用暴少马上得到一些东西。
除此以后,所有的能力的作用都是间接的。
如果你的岗位完全不需要你的汇编能力的话,我得说,你找错了岗位。这个世界
上岗位很多,真的存在一些岗位,是不必逢人非得违心地笑的。在那些岗位中,
我们更多的――虽然不是完全――只受到像汇编语言这种自然的和非人为的法则约
束,而不必受到人的评判。
当然,那样的岗位,前提是你得具备获得那种岗位的能力。
我想举一个不太恰当的例子,不太恰当的原因是有人可能会误解到另一方面。二
战的时候纳粹*犹太人。传说,一位历史学家快要被送去死了,他说了一句话
救了他的命,他说,"我还是个木匠。"
我并非指人文科学没有用处,而是指极端的情况告诉我们,有比人为的评判更深
刻的评判标准。我想,大家还记得小学老师对我们的要求,那并非上帝的裁判,
现在你身边一些人的指示,也是如此。
三 底层的规则
汇编语言突出的特点,还是它是底层的一个代表。它可以让我们更好的理解系统
如何运行。
这也可以用来埋汰别人。毕竟,谁对这个世界的规则了解和运用越纯熟,谁就越
具有成为这个世界主人的资格。在这个世界,跟谁是你爸爸叔叔三姨姥爷关系不
大。
这种规则,现实世界也一样有。
人人网上一位潘同学说:"闪光灯一开,这家伙,满眼的LOGO"。这是一张照片是
标注,照片的内容估计是一条大河,或者海岸,满眼都是商标广告。
我想说的是,这些LOGO都是霓虹灯的,是发光,而不是靠吸收光而被人看到的或
者被相机拍到的。所以,第一层,开闪光灯,不会让这些LOGO更亮。如果LOGO离
得近的话,不开闪光灯的效果更好。
这也是为什么拍星星拍月亮拍晚上的灯的时候,不应该开闪光灯的原因。
第二层,因为你的闪光灯估计非常之烂,所以根本照不了那么远。能照到2米开
外的闪光灯,就已经是那种大个的,你基本不会在旅游的时候携带的。
这也是为什么在演唱会的时候拍照不要开闪光灯的原因。除非你也在舞台上,能
把观众都挡住那么近,否则闪光灯除了炫瞎歌手的那啥眼,实在不会让他的脸更
亮从而能让你的小光圈完成曝光。
我们为什么能得出这些结论?因为我们对世界规则的了解。对这些规则我们熟练
到这样的程度,无论在什么情况下,我们都不会犯潘同学这样的错误。如果她读
了这一段,估计也记住了。
这样,我们因为能够熟练使用世界的这部分规则,所以成为了有用而可靠的人。
话说,二战时为什么历史学家要整死,不仅因为他们不能车钳铆电焊,更是因为
他们的工作太有用了――对于敌人有用。越是对敌人有用,越是要整死。不过,这
时我们是否要学习某些知识,就不能以有用这样的价值来衡量了。题外话。
四 训练,就是学习
与其他工程类课程差不多,而与人文类和某些理科课程不一样。汇编语言只有在
实践中才能真正理解。
所以,一定要练习。做书上的习题是远远不够的。我并不是建议完成书上全部习
题,而是指无论你是否完成书上的习题,都一定要自己设计一些实验,来检验你
学到的知识,你的那些猜想,同时,也借此提高动手的能力。不能随手挥出一拳
都会符合规范的拳手,跟不能挥拳也没有什么差别,更不用说只会用嘴打拳的。
一个典范的例子,李记者吹捧典同学的时候提到的。典同学当年学汇编的时候,
自己写了机器码的程序,用ultraedit之类的二进制编辑工具,自己对着指令表
一个字节一个字节写的。
我当时说,这其实电子学单片机课程中必然会做的实验,手工把助记符转为机器
码,还要算指令周期。典同学的可贵正在于,他这么做,是没有老师指导的。
只有那些在没有优秀教师指导的情况下,仍能复制甚至创造牛人的技术路线的,
才最终具有成为牛人的可能。而训练方法,正是技术路线中最重要的。