一个表达式定义了一个地址或者一个数字。表达式前后可以有空白。
表达式的值可以是一个绝对数、或者是一个特定section的偏移。如果表达式不是绝对值,而且没有足够的信息知道是哪个section。此时需要第二轮处理,但是as暂不支持第二轮处理,这种情况下,as以一个错误消息退出。
空表达式没有值,它仅仅是空白或者null。无论何时,如果需要一个绝对值表达式,你可以忽略该表达式,as假设值为0。这样做是为了和其它汇编器兼容。
整数表达式是运算符分割的一个或多个参数。
Arguments
参数是符号、数字或者子表达式。在其它上下文,参数也被叫做算术操作数。在本手册中,为了避免和指令操作数混淆,我们使用术语argument来解释表达式的一部分。保留operand做机器指令操作数。
符号被评估为{section NNN},section是text, data, bss, absolute或undefined中的一个。NNN是一个有符号2进制的32位补数(signed, 2's complement 32 bit interger)。
数字通常是整数。
数字可以是浮点数或大整数。这时你被警告,只有低32位被使用。而且as假装这32位是一个整数。
子表达式是一个左圆括号,跟着一个整数表达式,跟着右圆括号。或者是一个前缀操作符跟着一个参数。
Operators
操作符是算术函数,像+或者%。前缀操作符跟着一个参数。中缀操作符出现在参数中间,操作符前后可以有空白。
as有下列前缀操作符。
- 取反(Negation),二的补的反。
~ 取补(Complementation),按位取反。
中缀操作符。
操作符有优先级,同优先级从左到右执行。除了+和-,两个参数都必须是绝对值,结果也是绝对值。
1. 最高优先级
* / % << >>
2. 中间优先级
| & ^ !
3. 低优先级。
+ 如果一个为绝对值,结果有另一个参数的section。不能将两个不同section的参数相加。
- 如果右参数是绝对值,结果为左操作数的section。如果两个操作数同section,结果为absolute。
不能对两个不同section的参数做减操作。
== <> != < > >= >=
4. 最低优先级。
&& ||
这两个逻辑运算符可以用来结合子表达式的结果。不像比较运算符,一个真值返回1,一个假值返回0。
逻辑或的优先级稍低于逻辑与。