ZHCU947E June 2015 – January 2023
识别全局符号
.global symbol1[, ...,symboln]
.def symbol1[, ...,symboln]
.ref symbol1[, ...,symboln]
三条指令用于识别在外部定义或可在外部引用的全局符号:
.def 指令用于识别在当前模块中定义并可由其他文件访问的符号。汇编器将此符号置于符号表中。
.ref 指令用于识别在当前模块中使用但在另一模块中定义的符号。链接器在链接时解析此符号的定义。
.global 指令可根据需要充当 .ref 或 .def。
全局符号 的定义方式与任何其他符号相同;即,它显示为标签或由 .set、.equ、.bss 或 .usect 指令定义。如果多次定义了某个全局符号,链接器会发出“多重定义”错误。(汇编器可以为局部符号提供类似的“多重定义”错误。).ref 指令始终为一个符号创建符号表条目,无论模块是否使用该符号;而 .global 仅在模块实际使用该符号时才创建条目。
一个符号可以声明为全局符号的原因有两种:
本示例显示四个文件。对于使用的所有符号,file1.lst 和 file2.lst 相互引用;file3.lst 和 file4.lst 也有类似的关系。
file1.lst 和 file3.lst 文件是等效的。这两个文件都定义了符号 INIT 并使其可用于其他模块;这两个文件都使用了外部符号 X、Y 和 Z。此外,file1.lst 使用 .global 指令来识别这些全局符号;file3.lst 使用 .ref 和 .def 来识别符号。
file2.lst 和 file4.lst 文件是等效的。这两个文件都定义了符号 X、Y 和 Z,并使其可用于其他模块;这两个文件都使用了外部符号 INIT。此外,file2.lst 使用 .global 指令来识别这些全局符号;file4.lst 使用 .ref 和 .def 来识别符号。
file1.lst
1 ; Global symbol defined in this file
2 .global INIT
3 ; Global symbols defined in file2.lst
4 .global X, Y, Z
5 00000000 INIT:
6 00000000 00902058 ADD.L1 0x01,A4,A1
7 00000004 00000000! .word X
8 ; .
9 ; .
10 ; .
11 .end
file2.lst
1 ; Global symbols defined in this file
2 .global X, Y, Z
3 ; Global symbol defined in file1.lst
4 .global INIT
5 00000001 X: .set 1
6 00000002 Y: .set 2
7 00000003 Z: .set 3
8 00000000 00000000! .word INIT
9 ; .
10 ; .
11 ; .
12 .end
file3.lst
1 ; Global symbol defined in this file
2 .def INIT
3 ; Global symbols defined in file4.lst
4 .ref X, Y, Z
5 00000000 INIT:
6 00000000 00902058 ADD.L1 0x01,A4,A1
7 00000004 00000000! .word X
8 ; .
9 ; .
10 ; .
11 .end
file4.lst
1 ; Global symbols defined in this file
2 .def X, Y, Z
3 ; Global symbol defined in file3.lst
4 .ref INIT
5 00000001 X: .set 1
6 00000002 Y: .set 2
7 00000003 Z: .set 3
8 00000000 00000000! .word INIT
9 ; .
10 ; .
11 ; .
12 .end