ZHCU875Z August 2001 – October 2023 SM320F28335-EP
有时,一个表达式包含多个可重定位符号,或者无法在汇编时求值。在这种情况下,汇编器对目标文件中的整个表达式进行编码。确定符号的地址后,链接器计算表达式的值。
如果表达式的值(以位为单位)大于为其保留的空间,您将收到链接器发出的错误消息。
目标模块中的每个段都有一个重定位条目表。表中包含一个重定位条目,用于该段中的每个可重定位引用。链接器通常在使用重定位条目后将其删除。这可防止再次重定位输出文件(在重新链接或加载该文件时)。不包含重定位条目的文件是绝对 文件(它的所有地址都是绝对地址,即汇编时已知的地址)。如果希望链接器保留重定位条目,请使用 --relocatable 选项调用链接器(参阅节 8.4.3.2)。
在节 2.7的示例中,符号 X 和 Y 均可重定位。Y 在本模块的 .text 段中定义;X 在另一模块中定义。汇编代码时,X 的值为 0(汇编器假定所有未定义的外部符号的值为 0),Y 的值为 4(相对于 .text 段中的地址 0)。汇编器生成两个重定位条目:一个用于 X,一个用于 Y。对 X 的引用是外部引用(由列表中的 ! 字符表示)。对 Y 的引用是对内部定义的可重定位符号的引用(由列表中的 ' 字符表示)。
链接代码后,假设将 X 重定位到地址 0x7100。再假设将 .text 段重定位为从地址 0x7200 开始;Y 目前的重定位值为 0x7204。链接器使用两个重定位条目来修补目标代码中的两个引用:
0080' LC Y |
becomes | 0080' |
0004 |
7204 |
|
28A1! MOV AR1,#X |
becomes | 28A1! |
0000 |
7100 |
有时,一个表达式包含多个可重定位符号,或者无法在汇编时求值。在这种情况下,汇编器对目标文件中的整个表达式进行编码。确定符号的地址后,链接器计算表达式的值,如以下示例所示。
1 .global sym1, sym2
2
3 00000000 FF20% MOV ACC, #(sym2-sym1)
00000001 0000
符号 sym1 和 sym2 都是外部定义的。因此,汇编器无法对表达式 sym2 - sym1 求值,所以它对目标文件中的表达式进行编码。“%”列表字符表示重定位表达式。假设链接器将 sym2 重定位到 300h,将 sym1 重定位到 200h。那么链接器计算表达式的值为 300h - 200h = 100h。因此,将 MOV 指令修补为:
00000000 FF20 MOV ACC, #(sym2-sym1)
00000001 0100