什么是是汇编语言?
最近在学习汇编,相信很多伙伴和我一样,学习汇编并不是为了用汇编写程序,而是为了看得懂一些汇编代码,从而去做如逆向,破解等方面的操作。
那么汇编语言是什么呢?
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
大家都知道在计算一种一切都是以二进制的方式存在的,但是如果程序员用0和1去编写代码,那是十分头疼的,所以就用一些方便记忆的单词(助记符)去替代机器指令,从而让编码更方便。
学习的痛苦
汇编语言是十分枯燥的,而且有很多奇怪的地方,比如为什么有各种各样的寻址方式 ,还有为什么叫立即数呢,它明明就是一个数字啊, 起个这么古怪的名字。
而且,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植,对于同一平台还有x32和x64甚至x16之分,学起来十分难受,初学者都不知道要选择什么平台。
那么现在还有必要学习汇编吗?
答案是有必要的。
汇编和最底层的硬件打交道( 注意是硬件啊) , 所以学习汇编能对计算机的运行机制有个透彻的了解, 至少需要掌握这些知识:
什么是寄存器
程序在内存和CPU中是怎么折腾的
CPU是如何访问内存的
程序的分段
机器层面如何实现函数调用(理解缓冲区溢出攻击的基础)
中断及其处理
有了这些知识,肯定对冯诺依曼计算机有了深刻认识。
而这些知识又构成了操作系统的基础,有了这些基础,理解进程/线程的概念,以及他们的实现就非常容易,还有虚拟内存、文件系统、 I/O 等等。并不是说必须学了汇编才能理解操作系统,而是说看问题的深度不一样。
有了汇编的保驾护航, 你可以在头脑中建立起一个有更多细节,更多实现的计算机, 那些概念不是模糊的,而是清晰的、鲜活的。
操作系统的运行原理, 绝对是程序员受益一生的知识。
怎么学习
学习汇编一定要以某一指令集为基础,充分了解在这一指令集下(比如x86),我们计算机一步一步可以做些什么。在这之后,熟悉了常用的汇编指令和宏指令,还有一些硬件方面的奇技淫巧,再开始学习和思考,c语言是怎么实现的,怎么把c语言作为语法糖解糖成汇编语言,还有怎么混合编程。推荐汇编书籍:汇编语言 基于x86处理器(第7版中文版)