汇编程序是指把
汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的
源程序,输出的是用
机器语言表示的
目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编
伪指令组成。采用汇编语言编写程序虽不如高级
程序设计语言简便、直观,但是汇编出的目标程序占用
内存较少、运行效率较高,且能直接引用计算机的各种设备资源。它通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的
程序段。
背景信息
汇编执行指令是机器指令的符号化表示,其操作码用记忆符表示,地址码直接用标号、变量名字、常数等表示。汇编执行指令经汇编程序翻译为机器指令,二者之间基本上保持一一对应的关系。汇编伪指令又称作汇编指示,用于向汇编程序提供用户自定义的符号、数据的类型、数据空间的长度,以及
目标程序的格式、存放位置等提示性信息,其作用是指示汇编程序如何进行汇编。使用汇编语言编写的源代码,需要通过使用相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为汇编过程。
许多汇编程序可以识别代表地址和常量的标签(label)和符号(symbols),这样就可以用字符来代表操作数而无需采取写死的方式。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的。
许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计;在实际应用中,它通常被应用在底层硬件操作和高要求的程序优化的场合。驱动程序、
嵌入式操作系统和实时运行程序都需要汇编语言。
发展过程
汇编程序的雏型是在电子离散时序自动计算机 EDSAC上研制成功的。这种系统的特征是用户程序中的指令由单字母指令码、十进制地址和终结字母组成。第一个汇编程序是符号优化汇编程序(SOAP)系统,它是50年代中期为IBM650计算机研制的。这种计算机用磁鼓作
存储器,每条指令指出后继指令在磁鼓中的位置。当初研制SOAP系统的动机不是引入
汇编语言的符号化特色,而是为了集中解决指令在磁鼓中合理分布的问题,以提高程序的运行效率。IBM704计算机的符号汇编程序(SAP)是汇编程序发展中的一个重要里程碑。此后的汇编程序大都以这一系统为模型,其主要特征未发生本质的变化。随着计算机
软件的高速发展和广泛应用,汇编程序又吸收了
宏加工程序、高级语言
翻译程序等系统的一些优点,相继研制出
宏汇编程序、高级汇编程序。
分类
简单汇编程序
简单汇编程序 又称“装入并执行”式汇编程序。由于简便而得到广泛使用。这种汇编程序的特点是汇编后的机器语言程序直接放在内存之中准备执行。
目标程序所占据的存储位置是在汇编时固定的,并且以后不能改变,所以这种工作方式不能将多个独立汇编的子程序合并为一个完整的程序,而且只能调用位置与目标程序不冲突的程序库中的子程序。
模块汇编程序
模块汇编程序 为适应模块程序设计方法而研制的。它除了克服简单汇编程序的缺点之外,还提供并行设计、编码和调试不同
程序模块的能力,而且更改程序时只更改有关的模块即可。每个汇编后的
程序模块称为目标模块,多个目标模块经连接装配程序组合成一个完整的可执行的程序。
条件汇编程序
条件汇编程序 主要特点是具有选择汇编某些程序段的能力。它适用于编写选择性较大的程序或程序包,以便根据用户的需要和设备的配置情况剪裁、编制适当的
软件。这种
汇编语言通常要引入“条件转移”、“转移”等汇编指示,以便根据用户指定的汇编条件有选择地汇编某些程序段或控制汇编程序的加工路径。
宏汇编程序
宏汇编程序 主要特点是在汇编程序中增加宏加工功能。它允许用户方便地定义和使用
宏指令,适用于程序中多处出现、具有一定格式、可以通过少数参数调节改变的程序段落的场合。采用这种方法不仅减少程序的长度,增加可读性,而且程序段落的格式需要改变时,只须改动定义处,而不必改动每一使用处。
高级汇编程序
高级汇编程序 采用高级
程序设计语言的控制语句结构的汇编程序。它不仅保持
汇编语言表达能力强、程序运行效率高的优点,而且能充分吸收高级语言书写简单和易读的长处。这是由于高级汇编程序允许用户使用高级
程序设计语言的控制语句(如条件语句、循环语句、函数和过程)编写程序中的控制部分,而且还允许用户直接利用
汇编语言直接控制存储分配、存取
寄存器硬件,描述高级语言难于表达的算法。第一个高级汇编程序是N.沃思为IBM360系统研制的PL/360语言汇编程序,其特点是程序的控制部分采用高级语言的控制语句编写,而数据加工部分采用IBM360汇编指令编写。自此以后,又相继出现了类似ALGOL的汇编程序,类似FORTRAN的汇编程序FAT。
结构与实现
由于
汇编语言的指令与机器语言的指令大体上保持一一对应的关系,汇编算法采用的基本策略是简单的。通常采用两遍扫描源程序的算法。第一遍扫描源程序根据符号的定义和使用,收集符号的有关信息到符号表中;第二遍利用第一遍收集的符号信息,将源程序中的符号化指令逐条翻译为相应的机器指令。具体的翻译工作可归纳为如下几项:用机器操作码代替符号操作;用数值地址代替符号地址;将常数翻译为机器的内部表示;分配指令和数据所需的
存储单元。除了上述的翻译工作外,汇编程序还要考虑:处理伪指令,收集程序中提供的汇编指示信息,并执行相应的功能。为用户提供信息和源程序清单。汇编的善后处理工作,随目标语言的类型不同而有所不同。有的直接启动执行,有的先进行连接装配。如果具有条件汇编、宏汇编或高级汇编功能时,也应进行相应的翻译处理。
假定
汇编语言中规定符号的应用一定出现在定义之后,则两遍算法可容易地合并成一遍算法加以实现。
工作过程
工作过程:输入
汇编语言源程序。检查语法的正确性,如果正确,则将源程序翻译成等价的二进制或浮动二进制的机器语言程序,并根据用户的需要输出源程序和
目标程序的对照清单;如果语法有错,则输出
错误信息,指明错误的部位、类型和编号。最后,对已汇编出的
目标程序进行善后处理。
汇编语言
CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。
这些指令都是二进制的,称为操作码(opcode),比如加法指令就是00000011。编译器的作用,就是将高级语言写好的程序,翻译成一条条操作码。
对于人类来说,二进制程序是不可读的,根本看不出来机器干了什么。为了解决可读性的问题,以及偶尔的编辑需求,就诞生了汇编语言。
汇编语言是二进制指令的文本形式,与指令是一一对应的关系。比如,加法指令00000011写成汇编语言就是 ADD。只要还原成二进制,汇编语言就可以被 CPU 直接执行,所以它是最底层的低级语言。