首页 > 编程知识 正文

经典汇编程序100例,编程语言排行榜

时间:2023-05-04 08:54:41 阅读:173682 作者:3877

汇编语言(机器编程语言)编辑本词条为“科普中国”百科科学词条的编制与应用工作项目评析。 汇编语言(assembly language )是用于电子计算机、微处理器、微控制器或其他可编程设备的低级语言,也称为符号语言。 汇编语言使用助记符而不是机器指令的操作码,使用地址符号(Symbol )或标签)而不是指令或操作数的地址。 在不同的设备上,汇编语言对应于不同的机器语言指令集,并通过汇编过程转换为机器指令。 一般来说,特定的汇编语言和特定的机器语言指令集是一一对应的,不能在不同的平台之间直接移植。 [1]许多汇编器为程序开发、汇编控制和调试辅助提供了额外的支持机制。 还有提供宏的汇编语言编程工具。 也称为宏汇编程序。 汇编语言并不像许多其他编程语言那样广泛用于编程。 在今天的实际应用中,经常用于底层、硬件操作、要求高的程序优化。 驱动程序、嵌入式操作系统和实时可执行文件需要汇编语言。 [1]在[1]中名称汇编语言外文名Assembly Language学科软件工程发生的年代20世纪50年代编译方式汇编目录1的发展历程2语言特征的总体特点缺点3语言结构数据传输指令整数和逻辑运算指令移位指令位操作指令条件设定指令控制传输指令串操作指令输入输出指令令4相关技术汇编编译环境5发展前景6实用化7经典教材x86处理器arm和单片机发展的历史说到汇编语言的产生首先要说的是机器语言。 机器语言是机器指令的集合。 机器的命令是一旦展开,机器就能正确执行的命令。 计算机的机器指令是二进制串。 计算机将其转换成高低电平,驱动计算机的电子器件进行运算。 上述计算机是指能够执行机器命令并进行运算的机器。 这是早期计算机的概念。 我们常用的PC有完成上述计算机功能的芯片。 该芯片是常说的CPU (中央处理器)。 各微处理器由于硬件设计和内部结构的不同,需要通过不同水平的脉冲控制来工作。 所以每个微处理器都有自己的机器指令集,也就是机器语言。 早期的编程都使用机器语言。 程序员们把用0、1的数字编写的程序代码打在纸带或卡片上,1打孔,0不打孔,将程序通过纸带机或卡片机输入计算机,进行运算。 这样的机器语言由纯粹的0和1构成,非常复杂,易读难以修改,也容易产生错误。 程序员们很快发现了使用机器语言带来的麻烦,它们难以识别和记忆,阻碍了整个产业的发展,汇编语言应运而生。 汇编语言的主体是汇编指令。 组件命令和机器命令的区别在于命令的显示方式。 汇编命令是机器命令容易记住的书写格式。 134567操作:寄存器BX的内容发送到AX,1000100111011000机器指令movax,BX汇编指令后,程序员们用汇编指令编制源程序。 但是,计算机能读取的只有工作过程的机器指令。 那么,如何让计算机执行程序员用汇编指令编写的程序呢? 在这种情况下,需要能够将汇编指令转换为机器指令的翻译程序,这种程序被称为编译器。 程序员用汇编语言编写源程序,并用汇编编译器将其编译成机器码,由计算机最终执行。 [2]语言特性编辑汇编语言是一种直接面向处理器(Processor )的编程语言。 处理器在指令的控制下操作,使处理器能识别的各个指令称为机器指令。 每个处理器都有自己的一组指令,称为指令集。 当处理器执行指令时,可以在不同的指令下执行不同的操作,执行不同的功能,从而改变自身内部的操作状态或控制其它外围电路的操作状态。 汇编语言的另一个特点是操作的对象不是具体的数据,而是寄存器和存储器。 这意味着它直接与寄存器和存储器进行交互。 因此,汇编语言的执行速度比其他语言快,但同时编程也很复杂。 因为既然数据存储在寄存器和存储器中,就必然存在地址方式,也就是用什么方法找到需要的数据。 例如,在上述示例中,不像高级语言那样直接使用数据,而是首先从相应的寄存器AX、BX中取出数据。 这也增加了编程的复杂性,因为它是用高级语言寻址的部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。 再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。 正因为汇编语言有“与机器相关性”的特性,程序员用汇编语言编写程序时,可充分对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态。这样编写出来的程序执行代码短、执行速度快。汇编语言是各种编程语言中与硬件关系最密切、最直接的一种,在时间和空间的效率上也最高的一种,它是高等院校计算机应用技术必修的专业课程之一,对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术有重要作用 [3]   总体特点 1.机器相关性 这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。 2.高速度和高效率 汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、 CPU、 I/O端口等,且占用内存少,执行速度快,是高效的 程序设计语言。 3.编写和调试的复杂性 由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。 优点 1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、 存储器、 CPU、 I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。 2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。 缺点 1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语言语法和 编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性; 2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生 bug,难于调试; 3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。 [3]   语言组成编辑 数据传送指令 这部分指令包括通用数据传送指令 MOV、条件传送指令CMOV cc、堆栈操作指令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等。注意,J cc是一个指令簇,包含了很多指令,用于根据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等。 [4]   相关技术编辑 汇编器 典型的现代 汇编器(assembler)建造目标代码,由解译组语指令集的易记码(mnemonics)到 操作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体。使用符号参考是汇编器的一个重要特征,它可以节省修改程序后人工转址的乏味耗时计算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码。 [1]   编译环境 用汇编语言等非机器语言书写好的符号程序称为源程序,汇编语言编译器的作用是将源程序翻译成目标程序。目标程序是机器语言程序,当它被安置在内存的预定位 置上后,就能被计算机的CPU处理和执行。 汇编的调试环境总的来说比较少,也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说,功能良好的编译器用起来应当非常方便,比如,应当可以自动整理格式、语法高亮显示,集编译、链接和调试为一体,方便实用。 对于广泛使用的个人计算机来说,可以自由选择的汇编语言编译器有 MASM、 NASM、 TASM、 GAS、FASM、 RADASM等,但大都不具备调试功能。如果是为了学习汇编语言,轻松汇编因为拥有一个完善的集成环境,是一款非常适合初学者的汇编编译器。 [1]   发展前景编辑 汇编语言是 机器语言的助记符,相对于比枯燥的机器代码易于读写、易于调试和修改,同时优秀的汇编语言设计者经过巧妙的设计,使得汇编语言汇编后的代码比高级语言执行速度更快,占内存空间少等优点,但汇编语言的运行速度和空间占用是针对高级语言并且需要巧妙设计,而且部分高级语言在编译后代码执行效率同样很高,所以此优点慢慢弱化。而且在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。常说汇编语言是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是计算机(或微机)底层设计程序员必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。只是,现在计算机最大的领域为IT软件,也是我们常说的计算机应用软件编程,在熟练的程序员手里,使用汇编语言编写的程序,运行效率与性能比其它语言写的程序相对提高,但是代价是需要更长的时间来优化,如果对计算机原理及编程基础不扎实,反而增加其开发难度,实在是得不偿失,对比2010年前后的软件开发,已经是市场化的软件行业,加上 高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。 但是,迄今为止,还没有程序员敢断定汇编语言是不需要学的,同时,汇编语言(Assembly Language)是面向机器的程序设计语言,设计精湛的汇编程序员,部分已经脱离软件开发,挤身于工业电子编程中。对于功能相对小巧但硬件对语言设计要求苛刻的行业,如4位单片机,由于其容量及运算,此行业的电子工程师一般负责从开发设计电路及软件控制,主要开发语言就是汇编, c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程序员的十倍以上。这种情况是因为21世纪以来,学习汇编的人虽然也不少,但是真正能学到精通的却不多,它相对于高级语言难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。对于一个全面了解微机原理的程序员,汇编语言是必修语言。 实际应用编辑 随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/ C++, Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。 [1]此外,虽然有众多编程语言可供选择,但汇编依然是各大学计算机科学类专业学生的必修课,以让学生深入了解计算机的运行原理。 历史上,汇编语言曾经是非常流行的程序设计语言之一。随着软件规模的增长,以及随之而来的对软件开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿 Linux内核来讲,虽然绝大部分代码是用 C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。 首先,汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时响应的场合比较有用,比如仪器仪表和工业控制设备中。 其次,在系统程序的核心部分,以及与系统硬件频繁打交道的部分,可以使用汇编语言。比如操作系统的核心程序段、 I/O接口电路的 初始化程序、 外部设备的低层驱动程序,以及频繁调用的 子程序、 动态连接库、某些高级绘图程序、视频游戏程序等等。 再次,汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治,以及程序的调试和错误分析等各个方面。 最后,通过学习汇编语言,能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。