为什么要学习汇编语言?

一、我学习汇编的缘由

工作两年后,我为什么突然决定要学习汇编呢?在我的一些朋友看来很奇怪,确实,这个选择在我的技术学习生涯里,有点突兀。

我在上篇文章 《计算机非科班工作后如何爬出技术的绝望之谷,走向开悟之路》 中聊了下目前学习的瓶颈,决定要学习计算机科班的专业课程,打破认知差距。那么我应该如何选择重点课程,设置这些课程的学习顺序呢?

其实我最开始是学习了《数据结构算法》和《网络技术》的,这两者比较接近应用层,学习起来问题不大。然后我决定重点攻克《操作系统》,但是我发现在学习过程中涉及到许多偏硬件方面的内容,于是我决定先研究下《计算机组成原理》,但是当看到指令集体系结构这里时,发现有很多指令涉及到寄存器的操作,这些东西都像极了汇编语言,并且我回忆起了Java字节码指令好像也是类似的东西,这一刻我对汇编的好奇心被激发了。

说实话,汇编语言在我的印象中一直都具有相当的神秘色彩。还记得大学里学习C语言时,开篇就介绍了编程语言的三个层次:机器语言 - 汇编语言 - 高级语言,然后讲汇编语言非常底层,直接和计算机硬件打交道,开发效率低,学习成本高,然后我就再也没有和汇编语言打过交道了。如果我是C/C++开发者,可能对汇编并不陌生,毕竟都是代码是要编译成汇编的,确实有研究的必要。但是Java系语言有虚拟机屏蔽底层细节,且生态太过庞大,我一直没发现有学习汇编的必要。

但现在,我突然想破除这种神秘感了,我迫切想知道汇编到底是一门怎样的语言,突如其来的好奇心,同时带着一丝兴奋,我开始了汇编语言的学习。


二、汇编到底有什么用

上面讲了我学习汇编的来龙去脉,总结下原因主要有两个:
1.学习底层基础的道路上自然而然地遇到了汇编,并且我相信学习汇编会对我理解底层有一定帮助
2.对技术的好奇心,使我想要撕掉汇编在脑海里那神秘而朦胧的面纱

这时,如果稍微带点功利心地问,汇编到底有什么用呢?
就我自己而言,学习了汇编之后,我觉得它对我的用处主要有这样几点:

1.学习过程很美妙,真的,我脑海里很多之前看过但却朦胧的技术知识点都变得清晰起来,极大地鼓舞了自己,让我有更大的信心继续深入学习组成原理和操作系统了,这是一次破障的旅行、一次精神上的突破。

2.我对编程控制计算机运行有了较为深刻地理解:
什么是寄存器?
程序在内存和CPU中是怎么折腾的?
CPU是如何访问内存的?
代码(程序)和数据CPU是如何区分的?如何分段?
什么是栈?在内存中如何体现?
什么中断?什么是中断向量表?

对传说中的冯.诺依曼体系结构也有了相对具体的认识,能在脑海里建立起有着更多细节的计算机,那些看似抽象的概念逐渐变得清晰。

真的太值了。

如果抛开抽象的认知,从实际应用的角度出发,汇编又有什么用武之地呢?结合资料我总结了如下几点:

1.阅读bootloader代码:基本上,除了OS的核心部分有汇编代码以外,boot loader 的一部分一般是由汇编代码完成,能读懂这些代码对体系架构的理解和设备启动的流程都很有帮助。(Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行)

2.分析问题:现在编译器优化很厉害,生成的代码和C代码有时很难又严格的对应,所以在单步跟踪某些问题的时候,需要能够看懂一些汇编语句来分析程序真正执行的流程

3.性能:在设计及编码中考虑底层的执行流程,从而能编写高性能的代码

4.破解软件、游戏外挂、计算机病毒、加密、脱壳、逆向工程等

5.让你觉得能使用高级语言开发是多么幸福的一件事 ~

当然,这些汇编应用对于大多数开发者而言都是用不到的,但是,我觉得用不到不代表我们对此一无所知就理所当然!如果你真的对技术有所追求,请相信我,花两周时间学学它,一定有所值!


三、想成为技术高手,一定要懂汇编吗?

划重点:一定不要神话某些技术!

这里我就直接引用知乎大神们的回答吧!

陈然 机器学习、数据挖掘、人工智能 话题的优秀回答者

大概在另外一拨人的眼里,成为计算机学科的高手应该是把数学学好。你们这群人都只是低端的码农,只有把高等数学学好,精通概率、统计、随机过程、抽象代数,熟练掌握各种建模方法,才是计算机科学的王道。再结合各种领域知识,年薪百万轻轻松松。弄点高级算法几十亿被收购瞬间财富自由。

技术只是技术本身,计算机发展了这么多年,无数新技术层出不穷。每个人都靠着自己的专长在这个领域发家致富。有的人是因为懂客户需求,有的是擅长做设计,有的人擅长把成熟的技术应用到传统的学科之中。汇编只是这茫茫技术中的一种而已。

本质上来讲,高手的本身并不是掌握了什么技术,而是能够帮助别人解决问题。一种技术只是解决问题的一种方法,而不是唯一的方法。如果解决这些问题需要精通汇编,那么你一定需要掌握。如果想解决的问题并不需要了解汇编知识,你大可以不掌握。汇编知识与很多其他知识在知识本身这个层次上并无优异之分,只不过在计算机领域更底层一些。

最后,计算机的基础知识,比如操作系统、数据库、计算机网络、编译原理,该了解的肯定要了解,该入门的要入门。

至于是否要精通,如果你发现在你成长的过程中遇到的瓶颈,是对于底层的了解,那你就应该精通。

郭凛 十岁编程,至今二十余年,小成

一直觉得软件行业有个很有意思的现象,就是绝大多数人都觉得越是懂底层的人就越是牛逼。

不巧个人十来年前初中时开始用8086/8088汇编写一些小应用,后来大学到工作零零散散也写点,谈不上什么高手。但一直感觉汇编说白了就是一堆的MOV/CMP顶着寄存器和内存做各式各样晦涩的操作,外加INT各类硬件、系统中断满天飞,平时开发都是抱着一本手册四处查各种中断号及flag,熟练点的同事能背下中断,再熟练点的能看机器码如看汇编——一个同事经常自称“看尽天下A(ASM)片,心中自然无码(机器码)”。

个人觉得汇编说白了只不过是门语言而已,和c/java/c++本质上没有区别,只是你使用这门语言必须接触CPU寄存器、需要更好的关注和规划内存使用、需要了解各种硬件和系统级API(中断)、需要写更多行的代码、更容易出错、比高级语言更难写出优美的程序……这些……在我看来,除了让开发者更苦逼之外,实在看不出这门语言的好处。性能?现代编译器下的C语言早已和ASM相差无几。

如 @张运政 所说,要精通这门语言,确实需要比精通其他语言付出更大的努力,因此精通这门语言的人或许确实厉害,但这并不代表厉害的人一定要精通这门语言——充分不必要。

我更同意 @吴海波 的答案,编程并不只是操作系统和底层——如果只是这样那软件行业这几十年无数大师们的努力等于白费了,编程语言本身、软件设计、人工智能、软件工程、互联网……等等这些都是让编程变得丰富而有趣的元素。

是否懂底层不重要,在编程的路上坚持对美的追求,才是通往高手之路。

大神就是大神,他们的认知水平真的高!值得我们学习!

所以,这世界上没有什么是必须的,不是说想成为技术高手就非得去学汇编,非得花大力气研究它精通它,你只有根据自己的实际情况,综合权衡。

学还是不学呢?你会如何选择?反正我学了下,并且不亏 ? ~


参考资料:

https://www.zhihu.com/question/23088538
https://www.zhihu.com/question/20277860/answer/23148163

你可能感兴趣的:(汇编)