3.1.1 as86汇编语言语法
汇编器专门用来把低级汇编语言程序编译成含机器码的二进制程序或目标文件。汇编器会把输入的一个汇编语言程序(如srcfile)编译成目标文件(objfile)。汇编的命令行基本格式是:
as [选项] -o objfile srcfile |
其中,选项用来控制编译过程以产生指定格式和设置的目标文件。输入的汇编语言程序srcfile 是一个文本文件。该文件内容必须是由换行字符结尾的一系列文本行组成。虽然GNU as可使用分号在一行上包含多个语句,但通常在编制汇编语言程序时每行只包含一条语句。
语句可以是只包含空格、制表符和换行符的空行,也可以是赋值语句(或定义语句)、伪操作符语句和机器指令语句。赋值语句用于给一个符号或标识符赋值。它由标识符后跟一个等于号,再跟一个表达式组成,如"BOOTSEG = 0x07C0"。伪操作符语句是汇编器使用的指示符,它通常并不会产生任何代码。它由伪操作码和0个或多个操作数组成。每个操作码都由一个点字符"."开始。点字符"."本身是一个特殊的符号,它表示编译过程中的位置计数器。其值是点符号出现处机器指令第1个字节的地址。
机器指令语句是可执行机器指令的助记符,它由操作码和0个或多个操作数构成。另外,任何语句之前都可以有标号。标号是由一个标识符后跟一个冒号":"组成。在编译过程中,当汇编器遇到一个标号,那么当前位置计数器的值就会赋值给这个标号。因此一条汇编语句通常由标号(可选)、指令助记符(指令名)和操作数3个字段组成,标号位于一条指令的第1个字段。它代表其所在位置的地址,通常指明一个跳转指令的目标位置。最后还可以跟随用注释符开始的注释部分。
汇编器编译产生的目标文件objfile通常至少包含3个段或区 (section),即正文段(.text)、数据段(.data)和未初始化数据段(.bss)。正文段(或称为代码段)是一个已初始化过的段,通常其中包含程序的执行代码和只读数据。数据段也是一个已初始化过的段,其中包含可读/写的数据。而未初始化数据段是一个未初始化的段。通常汇编器产生的输出目标文件中不会为该段保留空间,但在目标文件链接成执行程序被加载时操作系统会把该段的内容全部初始化为0。在编译过程中,汇编语言程序中会产生代码或数据的语句,都会在这3个中的一个段中生成代码或数据。编译产生的字节会从".text"段开始存放。我们可以使用段控制伪操作符来更改写入的段。目标文件格式将在后面"Linux 0.12目标文件格式"一节中详细说明。