ILD

as语法
作者:Herbert Yuan 邮箱:yuanjp89@163.com
发布时间:2017-8-2 站点:Inside Linux Development

本章描述源文件中与机器无关的语法,gas语法和其它许多汇编器相似。gas语法受BSD 4.2汇编器启发,除了gas不汇编Vax位域。


1 Preprocessing

as内部的预处理:

    - 调整和删除多余的空格。在一行的关键字前保留一个空格或者tab,或者将一行中的其它空白合并成一个空白。

    - 删除所有注释,替换为一个空白,或者替换为合适数量的新行。

    - 将字符常量转换为合适的数字值。


它不执行宏处理,文件包含处理,或者其它C预处理器类似的事情。你可以使用.include指令包含文件处理。可以使用gnu C编译器驱动获得CPP样式的预处理,指定输入文件为.S后缀。多余的空格、注释、字符常量不能用作无需预处理的输入文本文件。

如果输入文件的第一行是#NO_APP,或者使用-f选项。空白和注释不会从输入文件中移除。

输入文件中,你可以要求移除特定部分的空白和注释,这部分内容在#APP行和#NOAPP行之间。这个功能主要是用在编译器的asm指令中包含注释和空白。


2 Whitespace

空白是一个或多个blanks或tabs。空白用来分隔符号,也使程序更易读。除非在字符常量中间,任何数量的空格等价于一个空格。


3 Comments

有两种注释方式,都等价于一个空格。

/*到下一个*/是一个注释,因此该种注释不可嵌套。

任何从行注释(line comment)字符开始到行尾的内容为注释。行注释字符和架构相关,一些架构行注释字符是多个字符。还有一些架构要求行注释字符为行第一个字符。还有一些架构使用2个字符序列开始行注释,还有一些架构可以使用命令行选项改变行注释字符。

如果行注释字符为#,它仍然有开启/关闭预处理、指定逻辑行号的作用。

为了和老汇编器兼容,以#开头的行有特殊含义。跟着#的应该为一个绝对表达式,表示下一行的逻辑行号。然后表达式后允许字符串。

1
2
3
                               # This is an ordinary comment.
     # 42-6 "new_file_name"    # New logical file name
                               # This is logical line # 36.

这个特性被反对,将来可能移除。


4 Symbols

符号由,大小写字母、数字和-.$3个字符组成。在大多数机器上,$也可以用作符号名。符号不可以以数字开头。符号名大小写敏感。符号名没有长度限制。支持多字节字符。符号由不在上述字符中的字符分开。或者以文件开始处分开。(源程序必须以新行结束)。

符号名也可以使用"引起来,此时任何字符可作为符号名,除了NUL字符。如果此时符号名包括",需要使用\转义。


5 Statements

一个语句(statement)以新行(\n)或者行分割符(line separator charater)结束。行分割符由机器决定。不是所有的机器支持行分割符。新行和行分割符被认为是语句前面的一部分。字符常量中的新行和分割符是一个例外,他们不结束语句。

以文件结尾来结束语句是一个错误。任何输入文件的最后一个字符必须是新行。

空白语句是允许的,其包含空白,空白语句被忽略。


语句以0或多个标签开始,可选的跟一个关键字符号,决定语句的类型。关键字符号决定语句剩下部分的语法。如果符号以.开始,该语句是汇编器指令,通常对所有的机器有效。如果符号以字母开始则是一个汇编语言指令,被汇编进机器语言指令。不同机器版本的汇编器识别不同的指令。

符号的标签立即跟着一个冒号:。标签前,冒号后的空白是允许的。但是标签和冒号之间不能有空白。

对于HPPA机器,标签必须在行首,冒号和标签之间可以有空白。


6 Constants

常量是一个数字。


6.1 字符常量 (Character Constants)

分为两种,字符和字符串。


字符串用双引号引起来,可以包含双引号和NULL字符。包含特殊字符的方式是使用\转义。

1
2
3
4
5
\b    转义退格,八进制ASCII码为,010
\f    转义换页,八进制ASCII码为,014
\n    转义新行,八进制ASCII码为,012
\r    转义回车,八进制ASCII码为,015
\t    转义水平制表,八进制ASCII码为,011

其它转义:

\ digit digit digit 每个数字为8进制,位了和Unix系统兼容,8和9也接受为数字,如\008的值为010。\009的值为011。

\x hex-digits ...    16进制,所有的后续16进制都结合在一起。

\\    一个\字符

\"    一个双引号。

\ anything-else    给出一个警告,但是汇编为好像\不存在一样,即转义为本身。


字符

单个字符跟在一个单引号后面,如'A。

字符也需要引用。如'\\。

注意,引号是重音符',而不是沉音符`。

跟在引号后的新行不是语句的结束。

字符常量的值,在数学表达式中是其字符的机器字节宽度码,如'A表示65。


6.2 Number constants 数字常量

有3中数字。Intergers和C语言的int一样。Bignums存储为大于32位。Flonums是浮点数。


整型

二进制:0b 0B开头,接01,如0b101

十进制:非0开头的数字。

16进制:0x或0X开头。

负数:以-开头。


Bignums

语法和整型相同,除了位数大于32位外。


Flonums

按如下顺序组成:

数字0

一个字母,高速as剩下的数字是一个浮点数。e是推荐的,不同的架构还有其它的数字。

可选的符号,+或者-

可选的整型部分。0个或多个十进制数。

可选的小数部分。.后面跟着一个或多个十进制数。

可选的指数,包含

    一个E或者e。

    可选的符号,+或者-

    一个或多个十进制数。

整数部分和小数部分至少要有一个。浮点数以10为基。


as使用整数做所有的处理。浮点数是使用运行as的机器计算的。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.