ZHCU947E June 2015 – January 2023
$DPR_BYTE(sym)、$DPR_HWORD(sym) 或 $DPR_WORD(sym) 运算符可应用于 MVKL 或 MVKH 指令的源操作数,从而将符号地址的 DP 相对偏移加载到寄存器中。当访问的数据对象不在使用 DP 相对寻址模式所需的有符号 15 位偏移范围内时,编译器会使用这些运算符。
EABI 要求将通过 DP 相对寻址方式访问的所有段都组合在一起。然后,链接器使用该组中第一个段的地址作为“静态基址”,其值附加到符号 __c6xabi_DSBT_BASE。DP 相对寻址随后以隐式形式将 __c6xabi_DSBT_BASE 的值合并到对所引用的符号进行的解析中。在后续的示例中,注释中的“static_base”表示这个静态基址的位置。有关数据分配和寻址的更多详细信息,请参阅《C6000 嵌入式应用二进制接口应用报告》(SPRAB89) 的第 4 章。
例如,假设编译器需要访问 .far 段中定义的名为“xyz”的 32 位对齐数据对象。编译器必须假定 .far 段离 .bss 段的基址(运行时库的启动例程已将相应地址加载到 DP 寄存器中)太远,因此不可能使用 DP 相对寻址模式直接访问“xyz”。编译器将改用 MVKL/MVKH/LDW 指令序列:
MVKL $DPR_WORD(xyz),A0 ; load (xyz - static_base)/4 into A0
MVKH $DPR_WORD(xyz),A0
LDW *+DP[A0],A1 ; load *xyz into A1
该指令序列也被称为 far DP 相对寻址。LDW 指令使用经过调整的 DP 相对索引式寻址版本。与 $DPR_WORD(sym) 运算符类似,提供的 $DPR_BYTE(sym) 运算符有利于 8 位数据对象的 far DP 相对寻址:
MVKL $DPR_BYTE(xyz),A0 ; load (xyz - static_base) into A0
MVKH $DPR_BYTE(xyz),A0
LDB *+DP[A0],A1 ; load *xyz into A1
提供的 $DPR_HWORD(sym) 运算符有利于 16 位数据对象的 far DP 相对寻址:
MVKL $DPR_HWORD(xyz),A0 ; load (xyz - static_base)/2 into A0
MVKH $DPR_HWORD(xyz),A0
LDH *+DP[A0],A1 ; load *xyz into A1
如果所访问的数据位于 DP 预期值范围内(假设在使用 MVK 指令之前将静态基址加载到 DP 中),那么访问数据的更有效方法是使用 MVK 指令。例如,编译器可以计算 .bss 段中 8 位数据对象的地址:
MVK $DPR_BYTE(_char_X),A4 ; load (_char_X - static_base) into A4
ADD DP,A4,A4 ; compute address of _char_X
同样,编译器可以计算 .bss 段中定义的 16 位数据对象的地址:
MVK $DPR_HWORD(_short_X),A4 ; load (_short_X - static_base)/2 into A4
ADD DP,A4,A4 ; compute address of _short_X
它还可以计算 .bss 段中定义的 32 位数据对象:
MVK $DPR_WORD(_int_X),A4 ; load (_int_X - static_base)/4 into A4
ADD DP,A4,A4 ; compute address of _int_X