ZHCU947E June 2015 – January 2023
以下是使用可重定位符号和绝对符号的表达式示例。这些示例使用了在同一个段中定义的四个符号:
.global extern_1 ; Defined in an external module
intern_1: .word '"D' ; Relocatable, defined in
; current module
intern_2 ; Relocatable, defined in
; current module
intern_3 ; Relocatable, defined in
; current module
内部值必须由绝对常量表达式构成。以下示例是非法的,因为在需要常量的地方使用了变量。
.word extern_1 * intern_2 - 13 ; Illegal
MVKL (intern_1 - extern_1),A1 ; Illegal
以下示例中的第一条语句是有效的,但其后的语句是非法的。
B (extern_1 - 10) ; Legal
B (10-extern_1) ; Can't negate reloc. symbol
LDW *+B14 (-(intern_1)), A1 ; Can't negate reloc. symbol
LDW *+B14 (extern_1/10), A1 ; / not an additive operator
B (intern_1 + extern_1) ; Multiple relocatables
下面的第一条语句是合法的;尽管 intern_1 和 intern_2 是可重定位的符号,但它们的差值是绝对值,因为它们在同一个段中。从一个可重定位的符号减去另一个可重定位的符号会将表达式简化为可重定位的符号 + 绝对值。第二条语句是非法的,因为两个可重定位符号的总和并非绝对值。
B (intern_1 - intern_2 + extern_3) ; Legal
B (intern_1 + intern_2 + extern_3) ; Illegal
可重定位符号在表达式中的放置位置对于表达式求值很重要。尽管下面的语句与前面示例中的第一条语句类似,但由于采用从左到右的运算符优先级,因此这条语句是非法的;汇编器会尝试将 intern_1 与 extern_3 相加。
B (intern_1 + extern_3 - intern_2) ; Illegal