热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

作者谢恩铭,公众号「程序员联盟」(微信号:coderhub)。转载请注明出处。原文:http:www.jianshu.compef4b0442b3ce内容简介什么是汇编语言语言层级

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

>作者 谢恩铭,公众号「程序员联盟」(微信号: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 老师,终生学习者。 热爱生活,喜欢游泳,略懂烹饪。 >人生格言:「向着标杆直跑」


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
蔡俊纬雅雯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有