学习汇编对编程有什么帮助?如何学习

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

内容简介


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

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

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

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

1. 什么是汇编语言


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

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

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

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

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

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

汇编语言类似这样:

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

2. 语言层级的区分


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

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

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

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

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

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

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

3. 汇编语言的特性


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

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

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

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

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

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

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

4. 学习汇编真的必要吗


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

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

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

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

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

而且:

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

5. 汇编怎么学


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

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

入门

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

我很感谢汇编语言,是它让我打好了编程的基础,也帮助我更深入理解了 C语言(特别是 C语言的难点:指针)。

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

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

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

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

我把当年学习汇编语言的文件夹上传到我的 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

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

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


我是 谢恩铭,公众号「程序员联盟」(微信号:coderhub)运营者,慕课网精英讲师 Oscar 老师,终生学习者。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,474评论 25 707
  • TITLE: 编程语言乱炖 码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快! 有时候还是蛮怀念十几、二...
    码园老农阅读 5,295评论 2 35
  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 11,080评论 6 244
  • 作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。转载请注明出处。原文:https://www.ji...
    程序员联盟阅读 4,713评论 17 85
  • 今天去植物园,最后一次幼儿园春游了。 春游中规中矩,没什么好说的,感觉植物园比之以前,有点没落了,有些地方也没好好...
    朝歌晚舞阅读 149评论 0 0