Hexagon Binutils GNU 手册(3)

240 篇文章 11 订阅

2.3 基本语法

2.3.1 字符集

汇编器可以识别以下字符:
字母(A…Z, a…z)
数字(0…9)
标点符号(包括+、[、_等)。
非印刷品(空格、制表符、换行等)。

2.3.2 符号

符号被定义为以下一个或多个字符:
所有字母(包括大写和小写)。
数字
字符"_.$"。
任何符号都不能以数字开头。大小写是重要的。符号的长度没有限制:所有字符都有意义。符号由不在该集合中的字符或文件的开头来定界(因为源程序必须以换行结束,文件的结尾不可能是符号定界)。

2.3.3 Whitespace

留白是指一个或多个空白或制表符,顺序不限。留白用于分隔符号,并使程序更加整洁,便于人们阅读。除了在字符常量中(第2.3.7节),任何空白的含义都与一个空格相同。

2.3.4 关键词

关键词是由汇编程序保留的符号。它们不能在汇编语言代码中被重新定义。关键词包括寄存器、汇编指令和汇编指令参数的名称。
有关关键词的更多信息,请参见《Hexagon程序员参考手册》。

2.3.5 指示

汇编器指令是源文件中的项目,汇编器将其识别为命令。指令被用来声明部分、常量和外部符号。它们也控制汇编器的功能,如宏和包含文件。
指令以一个句号(.)开始,后面可以跟一个或多个参数。句号后不能出现空格。指令名称是区分大小写的。
比如说:

.set debug, 1
 .if debug

关于指令的更多信息见第2.6节。

2.3.6 Numbers

数字可以以十六进制、二进制、八进制、十进制或浮点格式出现。
十六进制数字以’0x’或’0X’开头,后面有一个或多个
十六进制数字以’0x’或’0X’开头,后面是一个或多个十六进制数字(‘0123456789abcdefABCDEF’)。
二进制数字以’0b’或’0B’开头,后面跟着一个或多个二进制
数字(‘01’)
八进制数字以’0’开头,后面是一个或多个八进制数字
(‘01234567’)
十进制数字以一个非零数字开始,后面跟着一个或多个十进制数字。
十进制数字以一个非零数字开始,后面是一个或多个十进制数字(‘0123456789’)
浮点数以’0e’或’0E’开始,后面是以下字符
以下字符。
一个可选的符号(’+‘或’-’)。
可选的整数部分:零个或多个小数位
可选的小数部分:"…",后面是零个或多个小数位
一个可选的指数,由以下部分组成。
❒ 一个’E’或’e’。
❒ 可选符号:’+‘或’-’。
❒ 一个或多个小数位
注意 在一个浮点数中,整数部分或小数部分必须至少有一个存在。
要表示一个负数,请使用前缀运算符’-’(第2.3.9节)。
汇编器根据数字在内存中的存储方式,区分了三种类型的数字
在内存中的存储方式。
整数存储为32位整数
Bignums存储为64位整数
浮点数存储为32位或64位浮点数
双数的语法和语义与整数相同,只是该数字(或其负数)在二进制中需要超过32位来表示。之所以有这样的区别,是因为在某些地方允许使用整数,而不允许使用双值数。
一个flonum代表一个浮点数。翻译是间接的:文本中的十进制浮点数被汇编器转换为一个具有足够精度的通用二进制浮点数。这个通用浮点数由汇编器的Hexagon处理器特定部分转换为目标浮点数格式。
注意 汇编器使用整数执行所有处理。浮点数的计算不受主机中任何浮点硬件的影响。

2.3.7 Characters

汇编器支持两种类型的字符常量。
一个字符代表一个存储在一个字节中的单一字符。它的值可以在数字表达式中使用。
字符串(正确地称为字符串字头)包含了存储在多个字节中的零或多个字符。字符串的值不能用在数字表达式中。
字符由紧随该字符的单引号(’)组成。比如说:

‘e

引号字符必须是急性(左)引号,而不是严重(右)引号。
字符串以双引号字符(")为界。它们可以包含双引号或空字符。比如说:

"string"

在字符和字符串中包含特殊字符时,要在特殊字符前加一个反斜杠字符(’/’)。比如说:

‘\\

这个例子表示一个反斜杠字符,第一个反斜杠作为第二个反斜杠的转义字符。
汇编器支持在字符和字符串常量中使用以下转义字符:
\b (b)退格的记号;对于ASCII来说,这是一个八进制代码010。
\f 表示换行的符号;对于ASCII来说,这是八进制代码 014。
\n 换行的记忆法;对于ASCII来说,这是八进制代码012。
\r Carriage return(回车)的记忆法;对于ASCII来说,这是一个八进制代码 015。\t 水平制表符的记忆法;对于ASCII来说,它是八进制代码011。
\NNN 八进制字符代码。NNN表示3位八进制数字。为了与其他UNIX系统兼容,8和9被接受为数字:例如,\008的值是010,而\009的值是
011.
\xhex- 十六进制字符代码。所有尾部的十六进制数字都被合并。
" 代表单个双引号字符。在字符串中需要表示这个字符,因为未转义的`"'会终止字符串。
字符串。
\anything-else 任何其他字符在被\转义后都会产生一个警告信息,并将常数翻译成转义字符,就像没有转义字符一样。
不存在。
汇编器假定你使用了转义序列,因为你不想要下面这个字符的字面价值。然而,由于指定的字符是未定义的,汇编器知道它正在汇编错误的代码,所以警告你。

哪些字符是可以转义的,以及这些转义代表什么,是取决于机器的。如果你有疑问,请不要使用转义序列。
紧跟在重音之后的换行符(或at符号’@’)被视为一个字面字符,不作为语句的结束(第2.3.10节)。

2.3.8 Expressions

表达式指定了数字或地址值,并且可以在允许这种值的地方使用,包括指令和变量声明。白色的空间可以在表达式前面和/或后面。
一个整数表达式被定义为一个或多个由运算符限定的参数。参数是符号、数字或子表达式。
注意 在其他情况下,参数有时被称为 “算术操作数”。为了避免与指令操作数相混淆,这里使用的术语 "参数 "仅指表达式的一部分,将 "操作数 "保留给处理器指令操作数。
符号被评估后产生{section NNN},其中section是一个章节名称(第2.4节)。NNN是一个有符号的、2补的32位整数。
数字通常是整数。
一个数字可以是一个flonum或bignum(第2.3.6节)。在这种情况下,汇编器只使用双值的低阶32位,并为此产生一个警告信息。
子表达式包括一个左括号’(’,后面是一个整数表达式,后面是一个右括号’)’;或者一个前缀运算符,后面是一个参数。
注意 一个表达式的结果必须评估为一个绝对数字或一个特定部分的偏移量(第2.4节)。如果一个表达式的结果不是绝对的,并且汇编器没有足够的信息来确定它的部分,汇编器会用错误信息来标记这个表达式。
一个空的表达式没有值:它只是空白或空。在需要绝对表达式的地方,你可以省略表达式,汇编者会假定一个(绝对)0的值。

2.3.9 Operators

操作符是算术函数,如+或%。前缀运算符后面有一个参数。Infix运算符出现在其参数之间。操作符前面和/或后面可以有空格。
Prefix operators
汇编器支持下列前缀运算符。它们各取一个参数,必须是绝对的。

  • 否定。二的互补否定。~ 补码。Bitwise not.
    Infix operators
    Infix运算符需要两个参数,两边各一个。操作符有优先权,但优先权相同的操作从左到右执行。除了 "+“或”-"之外,两个参数必须是绝对值,结果也是绝对值。
    最高优先级:
* Multiplication.
/ Division. Truncation is the same as the C operator ‘/% Remainder.
< Shift Left. Same as the C operator ‘<<. <<
> Shift Right. Same as the C operator ‘>>. >>

Intermediate precedence

| Bitwise Inclusive Or.
 & Bitwise And.
^ Bitwise Exclusive Or.
 ! Bitwise Or Not.

Lowest Precedence

  • 加法。如果任何一个参数是绝对的,结果就有另一个参数的部分。你不能把不同部分的参数加在一起。
  • 减法。如果右边的参数是绝对的,结果有左边参数的部分。如果两个参数都在同一个部分,结果是绝对的。你不能减去来自不同部分的参数。
    注意 只有在一个地址中加减偏移量才有意义,你只能在两个参数中的一个有定义的部分。

2.3.10 Statements

语句以换行字符(’\n’)结束。换行符被认为是前面语句的一部分。字符常量中的换行符是一个例外:它们不会结束语句。
注意 以文件结尾字符结束任何语句是一个错误:任何输入文件的最后一个字符应该是换行。
如果你在语句中的任何新行前加一个反斜杠(\),你可以在多行上写一个语句。当汇编器读取一个反斜线的换行时,两个字符都会被忽略。你甚至可以在符号名称的中间加上反斜线而不改变你的源程序的意义。
一个空的语句是允许的,并且可以包括空白。它是被忽略的。
语句以零个或多个标签开始(第2.5.4节),后面可以选择一个关键符号,决定它是什么类型的语句。关键符号决定了语句的其余部分的语法。如果该符号以点’.'开头,那么该语句就是一个汇编指令。如果符号以字母开头,那么该语句就是一条汇编语言指令:它可以汇编成一条机器语言指令。

2.3.11 Comments

汇编器支持两种形式的注释。
C语言风格的划线注释
C++风格的行注释
定界注释以/开始,以/结束。它们可以横跨若干行,并且
不能被嵌套。比如说:


             /*
               The only way to include a newline (‘\n’) in a comment
               is to use this sort of comment.
*/
             /* This sort of comment does not nest. */

行注释以//开始,一直到源行的末尾:

.set debug, 1  // Include debugging code

在这两种情况下,注释都等同于一个空格字符。
Logical file names
为了与过去的汇编程序兼容,以’#‘开头的行有一个特殊的解释。在’#'后面应该是一个绝对表达式(第2.3.8节),指定下一行的逻辑行号。在表达式后面是一个可选的字符串(第2.3.7节);如果存在,它指定了新的逻辑文件名。该行的其余部分,如果有的话,应该是空白的。
如果该行的第一个非空格字符不是数字,该行将被忽略。(就像一个注释一样)。

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

注意 这个功能已被废弃,并可能从未来的汇编器版本中消失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解关于接口的应用,以及如何使用接口来实现一个Shape类的Hexagon子类,是吗?我可以为您解答这个问题。 首先,接口是一种定义了一组方法的抽象类型,它们没有任何实现,只是规定了一些方法的签名。在Java中,我们可以使用interface关键字来定义一个接口。接口的作用是让不同的类可以实现相同的方法,从而实现不同的功能。 现在,我们来看一下如何使用接口来实现一个Shape类的Hexagon子类。首先,我们定义一个Shape接口,其中包含一个计算面积的方法和一个计算周长的方法: ``` public interface Shape { double getArea(); double getPerimeter(); } ``` 接下来,我们定义一个Hexagon类,它实现了Shape接口,并且重写了getArea()和getPerimeter()方法。Hexagon类的实现如下: ``` public class Hexagon implements Shape { private double side; public Hexagon(double side) { this.side = side; } public double getArea() { return 3 * Math.sqrt(3) * Math.pow(side, 2) / 2; } public double getPerimeter() { return 6 * side; } } ``` 在Hexagon类中,我们使用了一个私有变量来表示正六边形的边长,然后重写了Shape接口中的getArea()和getPerimeter()方法,计算出正六边形的面积和周长。 现在,我们可以使用Hexagon类来创建一个正六边形对象,并调用它的getArea()和getPerimeter()方法来获取它的面积和周长。例如: ``` Hexagon h = new Hexagon(5); double area = h.getArea(); double perimeter = h.getPerimeter(); System.out.println("Area: " + area); System.out.println("Perimeter: " + perimeter); ``` 这段代码将创建一个边长为5的正六边形对象,并打印出它的面积和周长。 希望我的解答对您有所帮助。如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值