面向机器的编程语言 : 汇编语言:如果自己要发明一种编程语言,那么需要做些什么事情呢?
先要完成对于一门编程语言的各个要素:比如定义你自己的语法、数据类型、语言结构等等,其次你要写一个支持这些语法的解释器或编译器。 就我的理解,当你编写完成一个编译器或解释器,基本上你的代码就可以用了。
汇编语言是从机器语言转换过来的.最早的计算机系统没有可用的高级语言,是直接用0101这样的二进制编码来编程的,这样对绝大多数用户就很不方便,因为这要求对计算机系统的软件和硬件资源要非常了解才可以.记忆量也很大.到后来,大家就用一些符号来代替一些二进制代码,方便识别,比如原来代码1011意思是加法,现在就不写1011了,写成ADD,用ADD这个大家都容易识别的符号来编程,可以提升一些效率.但计算机的执行仍然只识别二进制代码,所以需要把汇编语言写的代码再转换成机器语言.
汇编语言是一种低级语言,好处是可以直接控制计算机的软硬件资源.坏处就是对编程人员的要求非常高.计算机执行的时候,用汇编语言编写的代码的执行效率是最高的.和机器语言代码的效率一样高.
1.面向机器的程序设计语言
汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语言中,用助记符(Memoni)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,如此就增强了程序的可读性和编写难度,象这样符号化的程序设计语言就是汇编语言,因此亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,还要由汇编程序或者叫汇编语言编译器转换成机器指令。汇编程序将符号化的操作代码组装成处理器可以识别的机器指令,这个组装的过程称为组合或者汇编。因此,有时候人们也把汇编语言称为组合语言。
汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
如图所示,在电路中,每条机器指令都表现为一组电信号,通过一排导线进入处理器。这些电信号有的呈高电平,有的呈低电平,哪些为高,哪些为低,取决于不同的机器指令。如果把高电平记为“1”,低电平记为“0”,那么,不同的机器指令将表现为不同的二进制序列,由于它们的无规律性,这就使得机器指令机器指令难以理解、书写和记忆。
人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易,需要借鉴自然语言的优点,为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令,而这些符号非常接近于自然语言的要素。基本上,汇编语言里的每一条指令,都对应着处理器的一条机器指令。
汇编语言包括两个部分:语法部分和编译器。语法部分提供与机器指令相对应的助记符,方便指令的书写和阅读。当然,汇编语言的符号可以被人类接受,但不能被处理器识别,为此,还要由汇编语言编译器将这些助记符转换成机器指令。
根据应用领域的不同,处理器的种类繁多,比如用于工业控制和嵌入式计算的Z80、MC68000和MCS-51、广泛应用于个人计算机的INTELx86系列,以及基于ARM体系结构的处理器,包括苹果公司在内的大企业都是ARM的客户。事实上,今天的ARM是最受欢迎的32位嵌入式处理器,而且,今天的ARM处理器比INTEL奔腾系列卖得还多,基本上是3:1的比例。
不同的处理器有不同的指令集。正是因为这个原因,每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器,也可能拥有不同的汇编语言编译器。一个明显的例子是INTEL x86系列的处理器,围绕它就开发出好多种编译器来,如MASM、NASM、FASM、TASM和AT&T等。而且,这每一种编译器,都使用不同的语法。
优缺点
优点
1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能象机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。
2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。
缺点
1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。因此,不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性;
2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试;
3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。
应用
历史上,汇编语言曾经是非常流行的程序设计语言之一。随着软件规模的增长,以及随之而来的对软件开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。
首先,汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时响应的场合比较有用,比如仪器仪表和工业控制设备中。
其次,在系统程序的核心部分,以及与系统硬件频繁打交道的部分,可以使用汇编语言。比如操作系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序,以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。
再次,汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治,以及程序的调试和错误分析等各个方面。
最后,通过学习汇编语言,能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。
特点
1.机器相关性。
这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
2.高速度和高效率。
汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。
3.编写和调试的复杂性。
由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。
x86处理器指令集
数据传送指令
这部分指令包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOVcc不是一条具体的指令,而是一个指令簇,包括大量的指令,用于根据EFLAGS寄存器的某些位状态来决定是否执行指定的传送操作。
整数和逻辑运算指令
这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。
移位指令
这部分指令用于将寄存器或内存操作数移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。
位操作指令
这部分指令包括位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。
条件设置指令
这不是一条具体的指令,而是一个指令簇,包括大约30条指令,用于根据EFLAGS寄存器的某些位状态来设置一个8位的寄存器或者内存操作数。比如SETE/SETNE/SETGE等等。
控制转移指令
这部分包括无条件转移指令JMP、条件转移指令Jcc/JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。注意,Jcc是一个指令簇,包含了很多指令,用于根据EFLAGS寄存器的某些位状态来决定是否转移;INT n是软中断指令,n可以是0到255之间的数,用于指示中断向量号。
串操作指令
这部分指令用于对数据串进行操作,包括串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串加载指令LODS、串保存指令STOS,这些指令可以有选择地使用REP/REPE/REPZ/REPNE和REPNZ的前缀以连续操作。
输入输出指令
这部分指令用于同外围设备交换数据。包括端口输入指令IN/INS、端口输出指令OUT/OUTS。
高级语言辅助指令
这部分指令为高级语言的编译器提供方便。包括创建栈帧的指令ENTER和释放栈帧的指令LEAVE。
控制和特权指令
这部分包括无操作指令NOP、停机指令HLT、等待指令WAIT/MWAIT、换码指令ESC、总线封锁指令LOCK、内存范围检查指令BOUND、全局描述符表操作指令LGDT/SGDT、中断描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值加载指令LSR、描述符访问权读取指令LAR、任务寄存器操作指令LTR/STR、请求特权级调整指令ARPL、任务切换标志清零指令CLTS、控制寄存器和调试寄存器数据传送指令MOV、高速缓存控制指令INVD/WBINVD/INVLPG、型号相关寄存器读取和写入指令RDMSR/WRMSR、处理器信息获取指令CPUID、时间戳读取指令RDTSC等。
浮点和多媒体指令
这部分指令用于加速浮点数据的运算,以及用于加速多媒体数据处理的单指令多数据(SIMD及其扩展SSEx)指令。这部分指令数据非常庞大,无法一一列举,请自行参考INTEL手册。
虚拟机扩展指令
这部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。
对于一个全面了解微机原理的程序员,汇编语言是必修语言。
分享到:
相关推荐
汇编语言是一种符号化的机器语言,用助记符来代替二进制代码,如“ADD”代表加法,“MOV”表示数据转移。这使得程序员可以更容易地编写程序,而汇编器则负责将这些指令转换为机器语言。尽管汇编语言比机器语言更易读...
最初的编程方式是机器语言,这是一种由0和1组成的二进制代码,对普通人来说难以理解和编写。为了解决这个问题,1946年至1953年的“低级语言时代”出现了汇编语言,如示例中的代码,它使用助记符代替机器代码,使得...
我们了解到,虽然高级语言让编程变得更加简单高效,但要深入了解计算机的工作原理,还需要掌握汇编语言和机器语言。通过实践操作,如使用编译器和反汇编工具,我们可以更好地理解程序在计算机内部是如何执行的。这...
从早期的汇编语言和机器语言,到今天五彩斑斓的编程语言生态系统,高级语言的兴起无疑为程序员们打开了一个全新的世界。 20世纪50年代,计算机科学尚处于其发展的早期阶段,程序员们主要依靠汇编语言和机器语言来...
从早期的机器语言和汇编语言,到面向过程编程,再到面向对象编程和现代的人工智能语言,编程语言的发展反映了人类试图简化与计算机交互的努力。每种语言都有其特定的应用场景和优缺点。选择合适的编程语言应基于项目...
高级计算机语言是在与计算机的不断交流中,人们对计算机程序的移植性需求不断提高,于是急需要一种不依赖于特定型号的计算机语言,这种语言编写的程序能在各种平台上正常运行。高级语言的发展也从最初的结构化语言...
汇编语言虽然在一定程度上简化了程序编写,但它依然需要程序员对计算机硬件有深入的了解,因此它仍然属于面向机器的语言。 相较于前两者,高级语言的出现标志着计算机编程的一个飞跃。高级语言,如C、C++、JAVA和...
Go语言,作为一门现代编程语言,自2007年由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三位大牛设计发明以来,已经迅速成长为开发人员喜爱的语言。Go语言之所以被称为网络和多核时代的C语言,是因为它从...
C++是Bjarne Stroustrup于1983年在C语言的基础上发展起来的一种强类型、静态类型的编程语言,它结合了过程化编程、面向对象编程以及泛型编程的特点,广泛应用于系统软件、应用软件、游戏开发、驱动程序编写等领域。...
3. 高级语言:随着计算机技术的发展,人们希望有一种更接近人类自然语言的编程语言,能够独立于特定的硬件,并且能够跨平台运行。1954年,第一个高级语言FORTRAN诞生,随后出现了许多其他重要语言,如ALGOL、COBOL、...
作为一种解释型语言,REBOL 支持多重编程范式,包括命令式、函数式、面向对象和声明式编程。REBOL 的一大特点是强大的元编程能力。 #### 五、Red 的基因图谱 Red 在编程语言家族中的位置可以追溯到 LISP、REBOL、...
3. 结构化程序设计方法:结构化程序设计是一种编程范式,它强调通过模块化和自顶向下的设计方法来构建程序。在结构化设计中,程序被分解为较小的、功能单一的模块,这些模块通过有限的控制流结构(如顺序、选择和...
HTML不是一种编程语言,而是一种标记语言。 计算机语言的入门实战通常从编写一个简单的程序开始,这就是著名的HelloWorld程序。这个程序的功能是在屏幕上输出"HelloWorld!"的文字。通过这个简单的程序,初学者可以...
学习编程不仅需要掌握语言的语法,更要理解程序背后的逻辑和思维方式。通过不断实践和学习,程序员可以利用这些语言创造出解决实际问题的软件,推动科技进步。 总之,计算机语言是连接人类思维和计算机执行的关键...
总结起来,计算机语言的发展是从底层的机器语言和汇编,逐渐过渡到高级的面向过程语言如C,再到更高级的面向对象语言C++,这个过程体现了人类对计算机编程方法的不断优化和抽象,以适应日益复杂的软件需求。每一种...
- **汇编语言**:为了简化机器语言的编写,人们发明了汇编语言,它使用助记符代替机器语言中的二进制代码。虽然比机器语言易读易写,但仍与具体的硬件架构紧密相关。 - **高级语言**:这类语言更加接近自然语言,...
随着计算机技术的发展,为了提高编程效率和可读性,人们发明了汇编语言,它以助记符代替机器码,但仍与硬件紧密相关。在20世纪50年代,FORTRAN(公式翻译)和Lisp等早期高级语言出现,标志着编程语言的初步抽象。 ...
### 高级语言程序设计(C语言)-1....通过以上内容,我们可以看出 C 语言作为一种重要的编程语言,在计算机科学领域占据着极其重要的地位。它不仅适用于操作系统和底层硬件编程,也是学习其他高级语言的良好基础。