掌握汇编仍然是技术高手的必经之路_第1页
掌握汇编仍然是技术高手的必经之路_第2页
掌握汇编仍然是技术高手的必经之路_第3页
掌握汇编仍然是技术高手的必经之路_第4页
掌握汇编仍然是技术高手的必经之路_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 掌握汇编,仍然是技术高手的必经之路 编者按:本刊今年8 月号刊登了王振祥先生的第三方程序代码安全检查技术一文,得到了读者的好评。有读者说,从该文中看到了久违的“汇编思维”,作者的底层技术功力令人赞叹。的确,王振祥先生在一线开发岗位上奋战十多年,在实际项目开发、前沿技术研究和汇编教学方面都有非常丰富的经验。他一直坚定地认为,只有彻底地掌握汇编语言以及汇编层次的开发技术,才能真正成为技术高手。这种观点在今天听起来无疑很“另类”。本刊编辑特别采访了王先生,就一些读者关心的问题请教了他的看法。问:王老师,现在Java、.NET 这样的开发平台大行其道,很多人认为现在已经进入了企业级应用的时代,汇编作

2、为系统级的开发技术不再重要,您如何看待这种说法?答:的确,如您所言,目Java、.NET 非常流行,从各种培训班所开设的课程就可以看出这一点(因为培训机构往往是与“流行”结合最紧密的),在普遍使用Java、.NET进行开发的时候,直接使用汇编编程无论从开发周期还是系统的维护,的确都是不现实的。在这种情况下,不要说是学生,就是汇编语言的老师虽然也在强调汇编语言的重要性,但从内心里他们可能也并不真正觉得汇编语言有什么用处。我在大量的授课、与学生接触、与教师座谈的过程中,发现许多教师(包括汇编语言的教师)和学生对于汇编语言的认识已经局限于一个必修课或者说公共课的层次,即必须学(因为必考),但是又没有

3、什么用处(因为根本不会用其进行任何工作),某重点大学的一个学生很“形象”地将汇编语言形容为“鸡肋”,但是汇编语言是否真的是鸡肋呢,如果真的是鸡肋,那么我们为什么要浪费老师和学生的大量时间和精力在这个“鸡肋”上呢?在一次关于汇编语言重要性认知的调查座谈时,我曾经问学生,“你们是否知道,在高级程序员考试中,汇编语言是必考的,并且占有较大的分值,许多考生就失败于汇编语言试题”(根据相关网站的统计,在高级程序员考试的各种题型中,汇编语言的得分率是最低的),对于这个问题,有学生回答,他知道高级程序员考试肯定包含汇编语言试题,但是他觉得将来会取消。真的会如此吗?这些情况说明了存在于计算机界的一种比较普遍的

4、观点,就是您在问题中所说的,“汇编作为系统级的开发技术不再重要”,一些人甚至认为应该取消汇编语言这门课程(一些学校的确已经在这么做了)。就我受益于汇编语言的亲身经历而言,我不敢认同这种观点。 问:那么您能否通过您的亲身经历,谈谈汇编语言的实用性? 答:好的。截止到今天,我连续从事软件开发工作有15年多,而在这15年中,一直在使用汇编语言,使用汇编语言的情况大约可分为以下3 个阶段:(1)1990 年 1997 年 这个阶段使用汇编语言开发了大量的DOS 下的应用程序、改写BIOS 为其增加基于中断方式的串口通信功能、DOS、Windows3.1,windows 95、Windows NT 下的

5、驱动程序,并且用汇编语言进行大量的对系统和其他应用程序的分析和跟踪。(2)1998 年 2000 年 在这个阶段所做的开发工作主要集中于VB,VC,虽然没有直接使用汇编语言编写程序,但是一直在使用汇编语言进行分析,比如通过跟踪对VB5/6 的修改改变其行为特征,进行病毒的分析等。(3)2001 年至今 仍然用汇编语言进行一些系统的分析工作(目前正在做的反编译的研究离开汇编语言就是无源之水),与此同时用汇编语言完成了一些嵌入式系统的开发工作。根据我自身的体会,我将汇编语言的作用大致进行了以下归纳,不一定完整。(1)从汇编入手,事半功倍所在的单位在开发一种教外国人学习汉语的对外汉语教学系统,我在1

6、987 年考入该单位的研究生院,1990年在写研究生论文时参与了该项目的工作,这是我第一次从事真正的软件开发工作,任务是为该对外汉语教学系统开发英汉-汉英电子词典。当时我的一个师兄和另外2 个工作人员用BASIC开发该系统的主程序(也就是现在常说的课件)。当时我的指导导师说,我们单位很少有人懂得汇编,因此建议我最好用汇编语言开发电子词典程序。对于当时的我而言,汇编、BASIC、C 是没有多少区别的,因为无论那种语言我都没有进行过什么实际的开发工作,既然导师要求,也就只好用汇编进行开发。说实在的,刚开始的3 个月里,实在是困难重重,因为高级语言提供了丰富的函数库,开发速度当然要快得多,也不要了解

7、那么多的具体细节,但是汇编语言就不一样,事无巨细都需要自己完成,从怎么输入、怎么输出、汉字如何存储和显示等等。但是经过这么3 个月的艰苦岁月之后,我发现我的水平提高很多,用BASIC 进行了4 年多开发的师兄在遇到一些问题时需要我的帮助,因为我在用汇编语言开发的过程中对于系统有了深入的了解。而用BASIC 开发则几乎不涉及对操作系统的内部。我很庆幸,我的第一个程序就是用汇编语言开发的。我觉得在掌握汇编之后再去学习BASIC、C 之类的高级语言将会非常容易。你的水平将会得到快速的提高,并且掌握的深度要远远大于你单纯从高级语言的角度去学习。(2)学习高级语言的利器 每种语言都有其难以掌握之处,比如

8、C 的指针等。但是如果你看一下其编译结果就会发现这些所谓的难点其实很容易。我的一个学生前些日子和我谈起学习汇编语言的体会时说,以前他觉得指针(尤其是指针的指针)非常难以理解,现在从汇编的角度去看指针其实非常简单。被许多人推崇为大师的侯捷在其STL 源码剖析一书中的内页上写到:“源码之前,了无秘密”。我想说,指令面前,一览无遗,汇编语言是根。所以我提倡:从编译器的角度,也就是从汇编语言的角度来学习和理解C/C+以及其它高级语言。(3)性能优化之必需 对于一个软件系统而言,我们常常为了提高其性能进行某种优化,关于性能优化同样符合所谓的80/20或90/10原则,也就是说对执行频率占80% 或90%

9、 的、关键的代码进行优化会使整个软件系统的性能得到大幅度提高。而要实现代码的优化,就要使用汇编语言。(4)学习先进技术、深入分析系统的基础工具 大家对于微软的Direct X肯定不陌生,但是也许你们根本会不相信,类似的技术其实早在1992 年就已经在AutoCAD中得到实现。我们知道,Direct X 解决的就是在Windows下硬件处理速度慢的题,而于1992 年推出的AutoCAD R12,在当时CPU 为286、386,内存大多为4M 的情况下,可以快速处理二维图形,并且能够显示三维图形,经过对其深入的剖析和跟踪发现其所采用了一种类似于目前的Direct X的技术,使用该技术,可以饶过W

10、indows 的GDI 层,而直接使用其显示驱动的功能,从而大大加快其速度。这种技术的实现,如果没有优异的汇编功底,是不可能的。(5)提高创新能力的基础条件 目前滚轮鼠标随处可见,但是在1996年,滚轮鼠标刚刚出现,其价格达到近千元,而当时普通的鼠标则只有几十元。当时我针对DOS,Windows 3.1,windows 95,windows NT 开发了可以通过拖动鼠标右键向上、下、左、右四个不同的方向移动来实现向相应方向滚屏的驱动程序。在1997年年底,在沈阳东软软件园开园的典礼仪式上认识了当时的请华紫光AutoCAD 事业部的江珊,谈到了我的这个可以让软件滚屏的软件,他问我该软件是否可以用

11、于在AutoCAD,因为以前从没有接触AutoCAD,我觉得很奇怪,AutoCAD 为什么不能滚屏?在回到北京之后,去实地了解了一下情况,结果发现,当时广泛流行的AutoCAD R12 由于受到DOS使用命令行实现操作的影响,根本就不支持滚动杆,其翻屏的工作是通过在命令窗口中输入命令实现的,非常不方便。当时觉得如果将滚屏的功能加入到AutoCAD 中是一个很好的机会,于是经过2个多月的对AutoCAD 的深入剖析,获取AutoCAD 的内部数据,为其增加了滚屏功能,并将该功能与鼠标功能相结合,从而为AutoCAD 增加了一个完整的补丁。1998年年初,该软件完成,但是很不走运的是,AutoDe

12、sk 公司在1998 年年初发布了其AutoCAD R14,而R14则增加了对滚动杆的支持,导致我们的软件完全无用。虽然并没有从该软件获得经济效益,但是并不表明该软件的开发毫无意义。因为AutoCAD R12从1992 年开始,到1998 年R14 推出,流行了近6年,我们在R14推出的时候开发该软件,只能说我们很不走运。但是倘若R14晚推出一年,该软件就会创造巨大的经济价值。从该软件的开发我也得出一个教训,在此愿意告诉大家,就是不要局限于计算机领域,而要跨行业,了解其它行业的需求。假如我早些时间接触AutoCAD,就会早些发现此问题,那该是多么好的一个机会。那么说这件事情和创新能力有什么关系

13、呢?假如我不懂得汇编语言,当然更无从谈起对系统的分析,那么当我知道AutoCAD的这一问题时,我根本不可能觉得会是一个什么机会,而只能静等开发商发布新版本。也就不会有这一新的软件的开发。(6)发现bug(调试)、系统安全分析的必要条件 汇编语言对于调试具有重要的意义,有人说,如果你不具备阅读编译器所生成的列表文件(其实就是汇编语言程序)的能力,那么你就是“在森林中迷路的小孩”,该是多么危险,尽管这种说法可能有些夸张,但也的确强调了汇编语言的重要性;另外,在调用他人的函数时常常因为某种原因而错误地使用,比如调用习惯不同、所传递的参数不正确等而导致错误,这时用语言进行单步调试很容易就可以解决问题。

14、进行过软件分析的人员都会知道IDAPro这个软件,这是一个使用最为广泛的静态分析工具,为了提供扩展的便利,该软件支持插件。我曾经为其开发一个插件,但是因为插件中使用了递归而导致其堆栈的溢出(因为插件使用的是idapro的堆栈),为此,我将插件的run函数(实现插件主要功能的函数)实现为naked函数,并将堆栈切换到插件自己的堆栈。但是每次执行插件时,都会出现错误。经过跟踪发现,Idapro在调用堆栈时使用的是Pascal调用习惯,而该函数又有一个参数,因此该naked函数必须以ret 4而不是ret返回。实际上有时候,库函数也可能出现错误(库函数也是人写的,出现错误当然是正常的),或者库函数的

15、功能不能完全满足你的要求,如果你不幸遇到这种情况,同样可以通过汇编语言对其进行修正。我曾经编写过一个程序,该程序用SetForegroundWindow将另外一个程序的窗口置前,开始编写程序时,使用的操作系统为windows 95 和Windows NT,程序能够很好地工作,但是到了Windows 98,Windows 出现之后,该程序出现不稳定,即有时能够置前,有时则不成功,经过对函数SetForegroundWindow的跟踪分析,结果发现,在Windows 95 和Windows NT 4.0 中,该函数无论在何处调用均可成功地设置,而在Windows 98和Windows 中,该函数必

16、须在被激活程序之外的程序中调用,方可成功地执行,如果在程序内部执行,则不能成功执行,即程序无法将自身设置为前台。这种同一个函数在不同系统下的不同表现就是通过跟踪分析才发现的。另外我曾经用VB 编写一个程序,该程序通过创建对象与另一个程序通信,但是VB在将对象变量与原来的对象切断联系之前,不允许同一个对象变量重新创建对象,这种处理方式无所谓对错,但是我们的工作却要求如此,因此通过对VB的msvbvm50.dll(msvbvm60.dll)的跟踪修改,使VB的工作机制符合我们的要求。而对于系统安全,大家可能听到最多的就是病毒和系统的漏洞。病毒的侵入是“打枪的不要”,悄悄地进入,是所谓的closed

17、 source,对于病毒的分析离开汇编语言便无从谈起;而对于系统的安全漏洞,除了一些分析工具可以自动发现一些漏洞之外,更多地是靠自己的分析才能发现的,汇编语言同样必不可少。我在对几十中病毒的分析中也学习到许多的汇编语言编程技巧。(7)在特定的资源限制情况下,汇编语言可能是唯一选择 1994 年,我曾经参与一个大型铜厂(其年产值达24亿元人民币)的计算机改造项目,其原来的计算机系统是80年代初开发的,由于当时计算机的硬件价格非常昂贵,因此其计算机系统只有区区几百K 内存。这对于当今的习惯于VB 之类的工具进行开发的程序员来说几乎是不可想象的。他们很难想象当时的程序员如何为了节省每一个字节而绞尽脑

18、汁,因此他们考虑问题的深度也往往很难比得上那些程序员。在PC 时代上,人们可能觉得象这样只有区区几百K 内存的的计算机不会再遇到,但是在嵌入式系统中,如果在存储空间非常有限(比如为了降低成本,可能整个系统只使用一个非常小的ROM )的情况下,汇编语言可能是个不错的选择。(8)使你成为常青树 在中国,许多人觉得程序员是吃青春饭的,过了30岁就不应该再做程序员了。确实,如果你只掌握那些时髦的开发工具,浮在所谓的“高层次”,那么由于计算机的飞速发展、每年那么多年轻人的加入,过了30岁之后再与这些年轻人比拼,的确会感到力不从心,那么你也只能吃青春饭。但是如果你留心去考察一下国外的一些所谓大师的年龄就会

19、发现,他们很多都是四、五十岁的。金山老总雷军到印度考察后曾经写过一篇文章,谈到国内与印度的主要差距就在于,国内的小年轻刚工作2、3年就想做项目经理(我觉得和吃青春饭危机感有关),而印度的项目经理多在四十岁以上。不可否认,计算机发展很快,在短短的六十多年的时间里已经发展了许多代,但是如果我们仔细想一下,在现在这样一个时代,其它的许多东西同样在飞快发展(只是相比较而言,计算机的发展可能更快一些)。但是必须认识到,计算机的发展也是逐步进行的,新技术也不是“从石头缝里蹦出来的”。我现在仍然保存着二十年前的大学教材,并且经常会拿出来翻翻,其实很多计算机的基础课程其实并没有太多的变化。因为许多理论其实在更

20、多年前就已经非常成熟了。说实在的,当时在大学里,由于缺少上机实习的机会(每周几个小时的机时常常连作业都无法完成),对于课本的理论根本无法深入理解。只是到了开始用汇编语言进行了一些开发并且对DOS 做了一些深入分析时,常常会突然想到课本所讲的内容,会想到原来当初所讲的就是这些东西。我觉得理论和实践就象从山的两个不同的方面进行挖掘,当两者挖通的时候,真的有一种豁然开朗的感觉。当出现了某项新的技术时,你如果掌握汇编语言,并且用汇编语言做过一些分析,那么你用这些已经掌握的知识掌握新的技术是很容易的。因此只要你能够逐步跟踪,那么你就可以在很容易跟上时代的步伐,而不是一个吃青春饭的。目前中国已经成为一个终

21、身学习的社会,因此学生的自学能力就显得特别重要,而汇编语言是自学计算机新知识的重要基础,同时在竞争激烈的学习型社会,自信心和积极向上的学习态度非常重要,而汇编语言就使学生具备这种自信心。参加培训的学生在与我聊天时普遍的反映是“有底气”。问:人们常说汇编语言能培养独特的思维方式,您认为这是一种怎样的思维方式?在实际中有什么意义? 答:说到编程语言能够培训思维方式,这是理所当然的,其实每种不同的语言都可以培养你不同的思维方式。抛开编程语言不谈,即使是我们人类所使用的自然语言也会影响其使用者的思维方式,这一点已经得到充分的证明。使用汉语者与使用英语者的思维方式是不可能相同的。同样对于编程语言而言,V

22、B,C,Java、汇编等,它们所培养的思维方式肯定是不同的,一个只用VB 进行开发的人员,根本不可能想到如何去节省程序所占用的空间。对于自然语言而讲,不同的自然语言的地位是相同的(只是使用者不同而已),但是对于编程语言而言,汇编语言与C、Java等的地位是完全不同的,因为汇编语言是与机器直接对话的语言,所以长期使用汇编语言的人无论是在学习新知识、还是在遇到问题时会习惯性地想到,机器到底在作什么,也就是说,它能够培养一种“刨根问底”的习惯,这种习惯的作用有以下几点:、快速、透彻、深刻地掌握新知识、学习新技术。、能够保持你的好奇心,这一点在快速发展的计算机领域尤其重要。 从前面的分析就可以看出,编

23、程语言可以帮助我们培养思维方式,但是所培养的思维方式往往又会对我们的思考构成限制,因此在形成特定的思维模式之后,还要注意能够脱离其束缚。这一点对于汇编语言也不例外。问:听说您相信在即将到来的嵌入式开发时代,汇编语言会扮演重要的角色,请您具体谈谈。 答:谈到软件开发,我们往往首先想到的就是VB,ASP,Java等,但是我们必须懂得,这些并不是软件开发的全部内容。一个完整的能够独立工作的设备所包含的软件既可能是使用操作系统的(比如PC 机),也可能是整个设备只包含一个单块式的软件(比如一些简单的嵌入式设备)。对于整个设备由一个单块程序控制的简单设备,其结构各式各样,对此种情况我们不做讨论,但是对于

24、使用操作系统的设备,实际上其软件构成可以分为以下几部分:1、与操作系统无关的软件,常常为固件程序(比如PC机的BIOS 等)2、操作系统的引导软件3、操作系统的组成软件4、应用软件对于大家所熟悉的基于PC 机的软件开发工作而言,前三种软件在绝大多数情况下,根本不在我们的考虑范围,主要的开发工作集中于第4种软件即应用程序的开发,这也是目前我们在谈到软件开发时往往就是VB,Asp,Java等的原因。但是随着嵌入式系统的兴起,这种情况会发生变化。嵌入式系统有巨大的市场需求前景,据估计,未来接入Internet的汽车、个人通信装置、家庭中520个联网的家用电器以及数以百万计的工厂系统都属于嵌入式系统的

25、领域。业界分析家认为, 嵌入式系统在IP电话、游戏装置和手持式通信装置的推动下将有突飞猛进的发展。另外嵌入式操作系统不仅在传统的工业控制和商业管理领域有极其广泛的应用空间,如智能工控设备、POS/ATM 机、IC 卡等,而且在信息家电领域的应用更具有极为广泛的潜力,例如机顶盒、WebTV、网络冰箱、网络空调等众多的消费类和医疗保健类电子设备,以及智能交通等领域的应用也呈现出前所未有的生机。PC 机一般具有一致的结构和标准配置,而嵌入式系统与之相比,则具有明显的区别。对于嵌入式系统而言,在PC 机上常见的键盘、显示器往往不会出现,而只有简单LCD、RS232之类的输入输出;嵌入式系统资源有限,不

26、会象PC 机那样假设有4G 的编程空间,因此在特定资源限制下,用汇编语言可以大大减少软件所占用的空间;在嵌入式系统的软件开发中,常常需要与硬件打交道,因为软件和硬件密不可分,当发生错误时,常常无法简单地确定是软件问题还是硬件线路问题,这时汇编语言就显得非常必要。 嵌入式系统千差万别,甚至可以连操作系统都不使用,也就是说,在嵌入式系统开发时,前面所叙述的四种开发工作可能都会涉及到。即使使用了强大如WinCE的嵌入式操作系统,我们可能也需要开发前两种软件。比如我曾经使用WinCE开发WBT(Windows-Based Terminal),其中就需要开发所谓的BootLoader(WinCE 的引导

27、程序,用汇编语言开发),并且对其厂商所提供的BIOS进行修改以适应自己的需要(当然更是使用汇编语言)。在开发WBT 的过程中,我还对台湾中强、威盛、台湾工研院、联想天乐、美斯比以及Wyse的采用WinCE 的WBT的启动过程进行了深入分析,这些WBT的bootloader全部用汇编语言编写。而对于比较简单的、根本就不要使用操作系统的应用情况,这四个部分均需要自己开发,这时对于CPU的初始化、必要硬件的初始化、硬件驱动程序等往往是汇编语言编写。比如Wyse 有一款WBT,其全部实现软件集中于一个512K 的ROM 中,成本低廉,而其开机速度又非常快,几乎可以与家电比美(我觉得计算机无论从开机速度

28、、从使用的方便程度、耐用性等方面应当实现家电化),这种系统的实现当然更多地使用了汇编语言。 可以看出,在PC时代,汇编语言的作用主要用于分析、调试,而在嵌入式时代,汇编语言则可能直接用于开发。如果您稍加留意,就会发现许多从事嵌入式开发的公司在招聘广告中一般都会要求具有汇编语言的经验。我们必须要真正理解需要,选择合适的硬件与软件,而不要动辄选择WinCE之类的复杂的系统。就好象我需要一个计算器,那么我花块钱买一个就可以使用,当然我也可以在Windows2000运行其计算器程序,但是要让Windows 2000运行计算器程序,首先必须能够让Windows2000运行起来,而让Windows 200

29、0运行又需要多么复杂的软件、硬件。因为Windows 2000 根本不是为运行计算器而开发的。同样地,Wince也不是为很多简单的应用而开发的。即使对于普通的应用,我们也不要动辄使用Windows 2000,Windows XP之类的系统,其实对于不是特别复杂的系统,DOS 是完全能够满足我们的条件的,你可以想一想,在DOS 时代,DOS承担了多少复杂的工作。联想的一款税务发票打印机就采用了DOS,性能稳定,成本低廉。 问:人们经常把C语言和汇编语言与核心技术联系起来,要掌握核心技术就必须掌握C 和汇编语言,您认为呢?现在中国的软件工业以集成和外围开发为主,您对于这样的发展思路有何看法? 答:

30、汇编语言的重要性我们已经谈了很多,关于C语言,其实很多人也知道它是非常重要的,但是在浮躁的心态的支配下,是很难耐得住寂寞、潜心于这些基础知识的学习。但是这些又确实是掌握核心技术的必要条件。现在微软大力宣扬.NET,但是如果你去分析一下Windows 2003的程序,就会发现这些程序根本就不是用什么.NET编写的。我曾经对Windows 2003 的许多组成软件进行分析,(包括驱动程序、应用程序、动态库等),发现这些程序都是用一种非常类似于VC 5/6 的编译器编写的,又不是VC5/6(多种文件类型识别工具均不能识别其编译器类型),也就是说,微软在开发这些系统的组成软件时使用的是一种类似于VC的C编译器(这种编译器没有公开,不知道是否属于微软的秘密)。Java、.NET 的确非常流行,但是有多少的系统软件是用VB、Java,.NET编写的?答案恐怕是否定的(Java虚拟机也是用C 实现的)。系统软件是用汇编、C开发的事实,也可以从另外一个方面印证了汇编语言和C 语言的重要性。我们的软件从业人员不可谓不多,我们每

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论