汇编语言的发展
机器语言
由0和1组成的机器指令(本质上就是有电和没电)
在早期变成过程中,由于使用机器码这种方式很难受,慢慢的衍生除了助记符,如:
- 加:0100 0000
- 减:0100 1000
- 乘:1111 0111 1110 0000
- 除:1111 0111 1111 0000
汇编语言(assembly language)
助记符这种方式很大程度的方便了编写代码,逐渐就形成了汇编语言,换句话说,汇编语言可以是助记符的集合(纯个人胡说。。。),汇编语言的特点是用符号代替了机器代码指令,而且与机器代码有一一对应的关系:
- 加:INC EAX 通过编译器0100 0000
- 减:DEC EAX 通过编译器 0100 1000
- 乘: MUL EAX 通过编译器 1111 0111 1110 0000
- 除:DIV EAX 通过编译器 1111 0111 1111 0000
高级语言(High-level programming language)
比如C、C++、Objective-C、swift,更符合,更能让人理解的语言,对于iOS来讲,Objective-C向swift转变是一个必然的过程,在接触swift的过程中,我发现swift与Android的Kotlin,Python,Java等等这些语言有了一些共通的地方,使得不同专业的同学对于跨专业操作编的更加的容易,我有一个疑问,在不久的未来,AI可以商用,甚至民用、通用,语言会不会大一统呢(这里也是个人胡说。。。) 回到高级语言,特点是通用性强,缺点也很明显,体积更大。
代码在终端上的编译过程:
- 汇编语言 与机器语言是一一对应的关系,每一条机器指令都有与之对应的汇编指令
- 汇编语言 与机器语言是可以互相转化的,反汇编:可行的,拿到二进制可以反汇编成汇编语言
- 高级语言 可以通过编译得到汇编语言\机器语言 ,但是机器语言/汇编语言几乎不可能还原成高级语言
- 不同的高级语言(Objective-C/Swift)可能对应的汇编是一样的。
- 同样的语言,不同的代码,可能对应的汇编语言也可能是一样的。
- 高级语言与汇编语言的对应关系:(一对多)
汇编语言的特点
- 可以直接访问,控制各种硬件设备,比如存储器、CPU等,可以最大程度上发挥硬件的功能
- 可以不受编译器的限制,对生成的二进制代码进行完全的控制
- 目标代码简短,占用内存较少,执行速度快
- 汇编指令是指机器指令的助记符,同机器指令一一对应 ,每一种CPU都有自己的机器指令集\汇编指令集,所以汇编语言不具备可移植性。
- 知识点很多,开发者需要对CPU硬件有一定的了解,不易于编写、调试、维护
- 不区分大小写,MOV与mov是一样的
汇编语言的用途:(见仁见智)
- 编写驱动程序,操作系统(Linux内核的某些关键部分)
- 对性能要求极高的程序或者代码片段,可与高级语言混合使用(内敛汇编)
- 软件安全 1、病毒分析与防治 2、逆向、加壳、脱壳、破解、外挂、免杀、加密解密、漏洞
- 理解整个计算机系统最佳起点与最有效的途径
- 为编写高质量的代码打下基础
- 代码的本质 1、函数的本质 2、 ++a底层是如何执行的 3、编译器到底帮助我们干了什么 4、DEBUG和RELEASE模式有什么关键的地方被我们忽略
借用大佬的话:
越底层越单纯、汇编是程序员需要用心理解的一门语言