杂谈-学汇编语言的必要性?
先说点题外话在前头,我发现自己目前一个很致命的缺点,就是我不能很好的将自己思考的内容完全的讲述出来
这不像是讲知识点,或者算法,技巧什么的,那些东西都是有迹可循的,我只需要跟着自己思考问题的思路走,就可以把他们讲出来
虽然表达的有时候不是很清晰,但是至少他是一个整体的
但是对于某些事情的思考,完完全全是随机的,不能控制的,可能有的时候我就会冒出一个观点,一个想法,但是仔细推敲却发现自己无法还原这些东西,就像是做了梦一样
包括今天要写的这个文章,也是自己突然冒出来的一点想法
我知道自己目前仍然是目光短浅的,并不能完全掌握整体,所以谈论这些东西肯定会有人有不同的意见
但是我仍然会把这些东西写出来,一来是想锻炼一下自己在这方面的思维能力,二来是将来回看自己曾经的观点,以把握自己的发展轨迹,帮助未来的规划
说了一堆,下面是正文
目前我的学校里正在教授8086的汇编课程,而对于我个人,由于我学过了一些x86_64的汇编,所以对于8086的汇编并不是很感兴趣,甚至有些反对
我反对的并不是汇编语言,而是8086汇编,这个老式的汇编语言,所以对于这篇文章的题目,其实更应该说成,学8086汇编语言的必要性
由于我有过一定的实用汇编语言的经历,所以经由这些经历来谈谈我对汇编语言的理解
如果看过我文章的同学可能知道,我曾经写过一篇有关C++初始化的文章,在那里我生成了C++的汇编代码,并通过阅读汇编代码,解决了对C++中初始化的疑问
仅通过这一点就可以看出,汇编语言是有用的,目前来说,学习汇编一样可以帮助我们解决问题,而不仅仅是其他人所谓的思想上的训练
但是这里注意,我生成的是现代的汇编指令,虽然不能说和8086汇编差得很远,但是至少也是需要看过一些书才能了解的东西,当然了,部分的指令的功能还是很相似的
只不过编写的逻辑等一些地方有了一定的差别
况且,如果只是最基本的现代汇编的话,相对比与8086来说是十分容易的,CSAPP一书中只用了第三章就讲清楚了大部分的现代汇编,同时留有两个lab供我们练习
而对于那两个lab中,我们大部分的时间其实都是在读,写汇编的地方相当的少,即便如此,这也可以给我们相当程度的帮助,可以说,我们现在学汇编,更多的是读
或者说,我们要明白,对于自己目前写的代码来说,他们会生成什么样的汇编指令
于此同时,再对比上8086汇编的实模式段模型,可以说是完全与现代脱节,我们不仅要花费时间去记忆一些奇怪的规则,还有masm里面的汇编伪指令,这些都对我们学习汇编语言造成了很大的障碍
可能我们是要学思想,但是对于现代的汇编来说,我们不仅更容易学,也会学到思想,甚至还能应用到我们的实际问题中,那么我们有什么理由不去看呢
还有一点,是我曾经在树莓派上编写一个玩具操作系统(详见github),在那里我也用到了汇编的知识
因为有的人可能会说,学习汇编可以帮助我们理解计算机底层,操作系统都是汇编写的什么的
操作系统的引导程序,确实需要用汇编写,但是对于操作系统的主体,我们用的大多是C语言
而汇编在其中的应用也是中断向量表,引导程序等,这些东西难道要我们再用8086去写吗?
对于这些东西,我们可以自己去简单的看一看arm8的汇编,然后也尝试在树莓派这种实机上取跑一跑,而不是待在dosbox里玩玩具
还有相对应的中断,内存映射IO,独立编址等,如果没有一定的操作系统的基础,真的可以理解这些东西吗
高校的汇编课程是为我们计算机组成原理和操作系统打基础的,所以适当的综合起来是没有太大关系的,这样也不至于让学生在学习过程中有割裂感
如果还在迷茫的同学,推荐去看一看CSAPP这本书,相信你会有所收获
当然我在这篇文章中的言论可能较为偏激,理性观看就好
文章评论
厉害啊