学习汇编对编程有什么帮助?如何学习
作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。
转载请注明出处。
原文:http://www.jianshu.com/p/ef4b0442b3ce
内容简介
- 什么是汇编语言
- 语言层级的区分
- 汇编语言的特性
- 学习汇编真的必要吗
- 汇编怎么学
常有人问:现在基本都使用高级语言了,汇编语言还需要学吗?学习汇编语言有什么好处呢?汇编语言看着这么头大,如何学习?
作为自学过汇编语言的人,我来谈谈心得。不才,有说得不正确之处,还望指正。
因为我的专业是嵌入式软件和移动信息,入门了 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 老师,终生学习者。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」
学习汇编对编程有什么帮助?如何学习相关推荐
- 一站式学习Java网络编程 全面理解BIO_NIO_AIO,学习手记(七)
大家好,我是方圆 目录 1. 在系统层面分析IO模型 1.1 BIO模型 1.2 NIO模型 1.2.1 IO多路复用 1.3 AIO模型(异步IO) 2. 异步调用机制 2.1 AIO中的异步操作 ...
- 儿童编程Scratch入门课程都学习什么内容?
Scratch几乎是小孩学习编程,最先接触到的软件,与复杂的成人编程语言相比,Scratch更适合孩子理解编程的内在逻辑.孩子用Scratch进行图形化编程甚至不需要编码,而且图形化编程和音乐.图像. ...
- 【转】学习汇编前你应该知道的知识
转载地址:http://www.zxbc.cn/html/20070611/22772.html 1.汇编需要什么工具和程序,到哪里下载? 目前阶段,汇编程序仅需要两个程序就够了.masm.e ...
- 一步步学习汇编(8)之指令
要理解ret,retf,call指令,必须要先理清以下汇编基础知识: 一. [bx]和内存单元<?xml:namespace prefix = o ns = " ...
- 新手必看的编程介绍,帮你推荐学习方案!
新手必看的编程介绍,帮你推荐学习方案! VB是什么? ) y0 {6 G# G; j3 B VB 是Visual Basic编程语言 * B. O2 G# z) O1 |- g8 `4 ^ 编写计算机 ...
- ARM汇编基础详解(PS学习汇编的原因)
目录 前言 1.GNU 汇编语法 2.Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令(内部寄存器数据非内存数据) 2.2 存储器访问指令(RAM) 2.3 压栈和出栈指令(了解) 2 ...
- 用机器指令和汇编指令编程(修改版)
实验名称 用机器指令和汇编指令编程(1) 实验日期 2018.10.22 学院:计软院 专业:计算机科学与技术 年级:2017级 班次:5班 姓名:陈奕明 学号 20171308194 一.实验目 ...
- arm体系结构与编程_教程:如何学习嵌入式系统(基于ARM平台)
一.嵌入式系统的概念 着重理解"嵌入"的概念 主要从三个方面上来理解. 1.从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构下的计算机,CPU只是 ...
- “C语言” 读书札记(五)之[让我们一起学习汇编吧!(段)]
"C语言" 读书札记(五)之[让我们一起学习汇编吧!(段)] 介绍 这几天满脑子都是寄存器,存储器--主要是卡在汇编语言上了,所以博文进度比较缓慢. 今天就先讲讲如何定义数据元素吧 ...
- 汇编语言——用DOSBox的debug查看CPU和内存 用机器指令和汇编指令编程
实验一 查看CPU和内存,用机器指令和汇编指令编程 实验目的 了解什么是Debug,以及Debug中需要用的一些功能 R:查看.改变CPU寄存器的内容 D:查看内存中的内容 E:改写内存中的内容 ...
最新文章
- JAVA07 接口与继承
- mysql binlog 目录_怎么查看mysql 的binlog日志存放的位置(linux和win)
- 第三次学JAVA再学不好就吃翔(part88)--ArrayList嵌套ArrayList
- java中 4 种取整函数
- phalapi可以依赖注入么_phalapi-进阶篇8(PhalApi能带来什么和进阶篇总结)
- C/C++代码调试:快速定位内存的申请和释放的位置
- magento php mysql_Mysql版本过低导致Magento报错的解决方案
- java mail 不用密码_Java之道|Windows MySQL5.7忘记了密码,不要慌,不用重装!!!...
- java基础学习(8)4种引用类型简析StrongReference、 SoftReference、 WeakReference 、PhantomReference
- 黑客逆向破解基础-1:壳、加壳和脱壳分别是什么?加壳的解压原理介绍。
- 75 颜色分类(排序)
- 史蒂夫·保罗·乔布斯
- Qtum量子链发布QIP-6,通过预编译合约大幅降低开发成本
- Kubernetes----Pod配置污点和容忍
- Apollo(一)-基本介绍
- 智能家居创意DIY之智能插座(Homekit可用)
- cannot be cast to linux 环境,[Redis] ** cannot be cast to java.lang.String
- 散列表的概念、构造方法及冲突处理
- Android日志收集
- 解决一则:Win7下Outlook 2007 无法打开.eml格式(原Outlook Express)格式的邮件
热门文章
- Python爬虫开发学习全教程第二版,爆肝十万字【建议收藏】
- 英语海报简笔php匹配img画,简单英语海报图片手绘,一年级英语海报图片 手绘?...
- 纯粹的Pure Storage,简单却又不简单
- php网站做分享到朋友圈,PHP实现微信分享朋友圈
- 炼数成金 Oracle EBS R12 DBA培训视频教程
- 计算机重装后如何连接无线网络,笔记本重装系统后无法连接无线网络怎么办
- 中国最大的IDC世纪互联是如何成为云计算时代的看客的
- 京东评价系统海量数据存储设计
- 解决数据库数据粘贴到excel中换行、换列问题
- java 发送html格式邮件 样式混乱解决