-- 作者 谢恩铭 转载请注明出处
微信公众号「程序员联盟」ProgrammerLeague
原文:http://www.jianshu.com/p/ef4b0442b3ce


目录

  1. 什么是汇编语言
  2. 语言层级的区分
  3. 汇编语言的特性
  4. 学习汇编真的必要吗
  5. 汇编怎么学

常有人问:现在基本都使用高级语言了,汇编语言还需要学吗?学习汇编语言有什么好处呢?汇编语言看着这么头大,如何学习?

作为自学过汇编语言的人,我来谈谈心得。不才,有说得不正确之处,还望指正。

我是2011年学习汇编语言的,那时候编程刚入门不久。

因为专业是嵌入式软件和移动信息,入门了C语言这个嵌入式领域的关键语言之后,我看到很多论坛说学习汇编对理解计算机的原理和内存很有帮助,就自学了一段时间。


什么是汇编语言

汇编语言(英语:assembly language)是一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。

在不同的设备中,汇编语言对应着不同的机器语言指令集。

一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。

使用汇编语言编写的源代码,然后通过相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为汇编过程。

现在汇编语言已不像其他大多数的程序设计语言一样被广泛用于程序设计,在今天的实际应用中,它通常被应用在底层硬件操作和高要求的程序优化的场合。

驱动程序、嵌入式操作系统和实时运行程序都会需要汇编语言。

汇编语言类似这样:

MOV    AX,DATA
MOV    DS,AX
MOV    AX,STACK
MOV    SS,AX
LEA    DX,MSG0
CALL    PRINTS
CALL    ENTER

语言层级的区分

习惯了编程Java或C++等语言的朋友看到上面这段代码是不是有点晕的感觉。

一般来说,编程语言的层级可以分为高级和低级。

低级语言(英语:Low-level programming language),在计算机科学之中,是电脑编程语言的一类。该类编程语言之所以被称为低级,是因为该类语言在运作时无法进行进一步的抽象化,而与中央处理器的机器语言或指令直接对应,因此一般亦被指是原始的编程语言。

汇编语言就属于低级语言。

高级语言(High-level programming language)是高度封装了的编程语言,与低级语言相对。它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示,使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。

现在一般我们用的编程语言,如C语言,C++,Java,Python,PHP,C#等都可以归类为高级语言。

不过,低级与高级其实只是相对的概念,Java对比C语言可以被认为是一种相对高级的编程语言。


汇编语言的特性

说到汇编语言的特性,除了运行高效,编写繁琐之外,暂时也想不到其他了。

一个简单的加法小程序,用汇编语言写,就要好多行。

至于用汇编语言写贪吃蛇等小游戏,真的很需要耐心。

其实,我们小时候玩的那种《超级玛丽》,《魂斗罗》等游戏,都是汇编语言写成的。

当时一个超级玛丽游戏才128KB大小,想想我们现在动辄好几个GB的大型单机游戏,一张图片可能就超过128KB了,不得不感叹汇编语言的强大和当时的程序员之牛叉。

如想了解更多,可以参看知乎上的这个话题:

《超级马里奥3》使用了什么样的技术可以在128KB中写进这么多东西?


学习汇编真的必要吗

我个人认为是必要的,而且以我的体会来看,相当值得!

当然了,不学也没什么不行的。不过就我个人的体会和各大论坛的评论来说,汇编语言的学习几乎是有百利而无害。

因为汇编语言可以让你接触到计算机很多底层的技术和知识,例如寄存器,内存,操作系统架构,等等。

这样,能促使你去阅读更多的有关计算机原理和编译原理的书,做到知其所以然,对我们经常使用的电脑兄有一个深入的理解。

总之:汇编语言的学习可以夯实我们的基础。而且,我们并不需要学到多深入,只要能入门即可。

而且:

无论是对于反病毒工程师还是逆向分析爱好者来说,汇编都是他们必学的知识,可以说汇编是一切逆向研究的根本。不管是使用OllyDbg还是IDA Pro,又或者是其它的一些反汇编工具,我们进行逆向分析的时候,是只能查看目标程序的汇编代码的,通过分析其汇编代码,来推测程序的运行机理。因此从这个角度来说,想研究逆向,就一定要精通汇编。


汇编怎么学

可以说任何语言的学习都逃不过看书+实作。那么,“让人生畏”的汇编语言该从什么书入门呢?

要看书,自然必须看好书。

入门

我觉得,入门可以看清华大学王爽老师的《汇编语言》,目前好像是第三版了吧。我当初2011年学习时还是第二版。

时间荏苒啊,一晃眼5年过去了。我很感谢汇编语言,是它让我打好了编程的基础,也帮助我更深入理解了C语言(特别是C语言的难点:指针)。

当时,王爽老师的《汇编语言》这本书的习题我全部做了,而且专门去这本书的官方论坛,一题题对答案,全对。

PS:我试了一下,这个官方论坛目前进不去了... 不知哪天能恢复呢?

不过大家也可以去这个论坛学习。

此外,CSDN的汇编语言论坛也是很不错的。

当然了,学习汇编语言的同时,如果能配合《深入理解计算机系统》这本入门的书就更好了。

我把2011年那时学习汇编语言的文件夹上传到我的Github上了,欢迎提意见:

https://github.com/frogoscar/asm-exercise

这里面大部分是《汇编语言》这本书的习题我的答案,不过不全了,而且还有一些其他的汇编程序。

进阶

王爽老师的这本书第二版是以8086汇编语言(Intel 8086 为16 位 CPU)作讲解的,后来我进阶看了一些80386(Intel 80386为32位的CPU)的书,推荐一本我个人非常喜欢的书:《Orange S:一个操作系统的实现》。

《Orange S:一个操作系统的实现》这本书是《自己动手写操作系统》的第二版。作者是于渊。

他的第一版《自己动手写操作系统》很受欢迎,因为一般很少有人能将晦涩难懂的操作系统讲得如此有趣。后来他写了更加完备的第二版。

第二版的书名有点特别,Orange是英语《桔子》的意思。据作者在序里面说的,第一版的操作系统名字是Tinix。而第二版换成了Orange’s,这名字来自于作者的妻子。

于渊老师的这两本书都一步步引导读者用汇编语言和C语言编写出一个具备基本功能的操作系统。

《Orange S:一个操作系统的实现》这本书的源代码在Github上:

https://github.com/yyu/osfs00

当然了,其他还有很多汇编语言的优秀书籍和学习资源,欢迎大家留言补充,谢谢!

祝大家都能愉快地学习汇编语言,更好地掌握编程!


我是 谢恩铭,在巴黎奋斗的软件工程师。
我创建了程序员联盟的 知识星球,欢迎加入。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」