ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , C346BA02 , C348A01 , CS241C01-Q1 , CS241C05-Q1 , CS246C01-Q1 , CS348C02-Q1 , OMAP-L132 , OMAP-L137 , OMAP-L138 , S470AV336LYSQRB , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
以下是使用可重定位符号和绝对符号的表达式示例。这些示例使用了在同一个段中定义的四个符号:
.global extern_1 ; Defined in an external module
intern_1: .word '"D' ; Relocatable, defined in current
; module
LAB1: .set 2 ; LAB1 = 2
intern_2 ; Relocatable, defined in current
; module
intern_3 ; Relocatable, defined in current
; module
此示例中的语句使用已定义且值为 2 的绝对符号 LAB1。第一条语句将值 51 加载到 R0 中。第二条语句将值 27 加载到 R0 中。
MOV R0, #LAB1 + ((4+3) * 7) ; R0 = 51
; 2 + ((7) * 7)
; 2 + (49) = 51
MOV R0, #LAB1 + 4 + (3*7) ; R0 = 27
; 2 + 4 + (21) = 27
以下示例中的第一条语句是有效的,但其后的语句是无效的。
LDR R1, intern_1 - 10 ; Legal
LDR R1, 10-intern_1 ; Can't negate reloc. symbol
LDR R1, -(intern_1) ; Can't negate reloc. symbol
LDR R1, intern_1/10 ; / isn't additive operator
LDR R1, intern_1 + intern_2 ; Multiple relocatables
下面的第一条语句是合法的;尽管 intern_1 和 intern_2 是可重定位的符号,但它们的差值是绝对值,因为它们位于同一个段中。从一个可重定位的符号减去另一个可重定位的符号会将表达式简化为可重定位的符号 + 绝对值。第二条语句是非法的,因为两个可重定位符号的总和并非绝对值。
LDR R1, intern_1 - intern_2 + intern_3 ; Legal
LDR R1, intern_1 + intern_2 + intern_3 ; Illegal
可重定位符号在表达式中的放置位置对于表达式求值很重要。尽管下面的语句与前面示例中的第一条语句类似,但采用的却是从左到右的运算符优先级,因此这条语句是非法的;汇编器会尝试将 intern_1 与 extern_3 相加。
LDR R1, intern_1 + intern_3 - intern_2 ; Illegal