汇编语言与机器语言
什么是汇编语言 百度一下
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
简单来说,汇编语言是机器语言(二进制指令)的文本形式,与指令是一一对应的关系
。汇编语言由汇编编译器汇编为机器语言(二进制指令)交CPU执行。
汇编语言(符号语言)是面向CPU的,因此CPU不同,汇编语言就不一样,有什么CPU架构就有什么汇编语言,比如x86架构的就是x86汇编,ARM架构的CPU对应于ARM汇编,MIPS架构的CPU对应于MIPS汇编。
CPU根据总线宽度可以分8位,16位,32位,64位等,所以相应的就有8位汇编,16位汇编,32位汇编等。
汇编语言优点
1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。
2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。
缺点
1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性;
2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试;
3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。
汇编语言与高级语言的区别:
1.汇编语言依赖于硬件体系(CPU),且助记符量大难记,于是人们又发明了更加易用的所谓高级语言。在这种语言下,其语法和结构更类似普通英文,且由于远离对硬件的直接操作,使得一般人经过学习之后都可以编程。高级语言通常按其基本类型、代系、实现方式、应用范围等分类。
2.汇编语言与cpu有关,高级语言与cpu无关。
高级语言有选择,循环,汇编语言没有。
高级语言有符号整数型,无符号整数型,浮点型,汇编语言不区分,只有16位的字,32位的双字
高级语言运算时像数学一样+-*/, 汇编语言用的是指令,add, sub, multi
汇编语言可直接使用寄存器,高级语言不可以
3.编译器的设计,有的编译器直接将高级语言编译成机器语言,有的编译器直接将高级语言编译成汇编语言。
编译器
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
高级语言:
是相对于汇编语言而言的,是高度封装了的编程语言,与低级语言相对。它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。
高级语言基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。编写的程序称之为源程序。主要有C,C++,Python,perl 等等。
高级语言主要分为2类:
解释型:原代码由解释器一边解释为可执行的机器语言,一边执行,效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。如python。
编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(* .OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如C/C++。
关于汇编语言,可参考http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html