一、我学习汇编的缘由

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

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

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

为什么要学习汇编语言?相关推荐

  1. 为什么要学习汇编语言?如何正确学习汇编语言?

    汇编语言是计算机系统结构的接口,它介于软硬件之间,学习的时候,必须结合软件和硬件来学习. 1 向上结合高级语言 学习汇编语言的时候,不可孤立学习汇编语言,当今时代很少之间用到汇编语言编程,但是使用汇编 ...

  2. 为什么要学习汇编语言

    目录 1. 可以更好地理解计算机系统架构 2. 可以更好地理解工具链(Tool Chain) 3. 提高算法开发技能 4. 增进对函数或过程的理解 5. 获得对I/O缓冲区的理解 6. 理解编译器的工 ...

  3. 汇编call指令详解_我也能写出雷军的的代码吗?最好的汇编语言入门教程在这里!...

    作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2018/01/ 之前,嵌入式Arm曾经发送过一篇名<给跪了!来看看雷军 1994 年写的代码,经典老古董(附完 ...

  4. Intel汇编语言程序设计学习-第一章 基本概念

    第一章基本概念 1.1  简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...

  5. Java学习笔记8-1——汇编语言入门

    目录 概述 进制运算 二进制 数据宽度 无符号数和有符号数 原码.反码.补码 位运算 位运算实现加减乘除 汇编学习环境和必要说明 汇编语言 通用寄存器 内存 未完待续 概述 为什么要学习汇编语言 进制 ...

  6. 学习汇编语言的必要性

    1.写在前面 用汇编语言作为自己程序设计的主流语言是不现实的,当代码量达到一定程度后,代码的维护会变困难,甚至不可能实现. 但我们仍要学习汇编语言,但学习汇编的目的不是用它去进行实实在在的程序设计,而 ...

  7. 【汇编】AT89C52点亮一盏LED灯(汇编语言)

    学习利用汇编语言写单片机程序的第一步是要学习汇编语言的相关理论知识,那么实践操作的第一步肯定是从点灯开始啦! 编译环境:keil4 编译语言:汇编语言 内容:   一.keil4建立AT89C52的工 ...

  8. 简明x86汇编语言教程

    我不想夸大或者贬低汇编语言.但我想说,汇编语言改变了20世纪的历史.与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘.坐在显示器面前,甚至使用鼠标.语音识别.我 ...

  9. 简明x86汇编语言教程_转载

    第○章 写在前面 我不想夸大或者贬低汇编语言.但我想说,汇编语言改变了20世纪的历史.与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘.坐在显示器面前,甚至使用 ...

最新文章

  1. linux lvm 大小与硬盘大小关系,linux lvm扩容磁盘大小
  2. 朴素贝叶斯算法的python实现
  3. [JAVA]引入目录下所有jar包等问题
  4. No module named import_export.admin
  5. 10.17 linux 文件权限
  6. python和按键精灵自动化测试_按键精灵对APP自动化测试(下)
  7. 空心点_空心砖的新玩法,看完大开眼界
  8. Spring Cloud 入门 之 Hystrix 篇(四)
  9. (105)FPGA面试题-查找程序中的代码错误
  10. 【往届已EI稳定检索】第二届计算机科学与管理科技国际学术会议,多主题征稿!...
  11. 四因素三水平正交试验表_正交实验设计过程
  12. Word小技巧总结(持续更新中……)
  13. lzg_ad:XPE网络功能组件
  14. html中绝对定位的父级,【CSS学习笔记】绝对定位的父类参照物的确定
  15. redis----------基本命令使用
  16. 前程无忧将办海外留学生招聘会;中兴任命倪飞为终端事业部总裁 | 美通企业日报...
  17. 一文网尽CV/Robotics顶会论文常用高级词汇/句式!
  18. Kafka单机版安装教程及测试(附每一步操作截图及说明)【一看就懂】
  19. 全新英特尔®凌动™处理器E3900系列:支持下一代智能互联的物联网设备 —— 这个全新处理器系列把计算能力迁移到更靠近传感器的位置,从而减轻把所有处理工作推向数据中心的需求...
  20. Appium基础篇14-上下左右滑屏操作swipe方法

热门文章

  1. 无线路由器经常掉线断网的可能的原因
  2. 使用GBase XDM C API 通常按以下五个步骤
  3. 迅雷的地址解析--把自己的下载地址变成迅雷链接
  4. 什么是dB、dBm、dBc?
  5. 西门子PLC中DB与DI有什么区别
  6. 不是吧,还有人不会做圣诞节头像小程序(可开通流量主,赚零花钱)
  7. Oracle Functions快速入门
  8. 面向对象,数据库交互的Spring-boot(新手)
  9. 在Word加载EndNote插件
  10. 时序数据库为什么选 Prometheus