ZHCADC5A June 2013 – June 2020
有关在 MSP430X 上汇编的 MSP430 本机指令,请参阅节 11.5.1.4。
MSP430X 的指令编码具有与 MSP430 不同的立即数字段,需要不同的重定位。
“ABS20”和“PCR20”重定位用于“MSP430X 扩展指令”。这些指令需要额外的操作码前缀字来编码 20 位寻址模式(MOVX、CMPX、ADDX 等)。
“ABS20”重定位也用于“MSP430X 地址指令”。这些指令允许一种 20 位寻址模式,无需额外的操作码前缀字(ADDA、MOVA、CMPA、SUBA、CALLA)。
R_MSP430X_ABS20_EXT_SRC、R_MSP430X_ABS20_EXT_DST 和 R_MSP430X_ABS20_EXT_ODST 重定位用于绝对、索引和立即寻址模式,但仅限于 MSP430X。它们是不同的,因为它们在指令编码中编码不同的字段。SRC 重定位源操作数;DST 和 ODST 重定位目标操作数。如果源操作数的寻址模式需要额外的字进行编码,包括常量生成器无法处理的 20 位地址和 20 位立即数常量,则使用 ODST 而非 DST。
MOVX &X, R5 ; R_MSP430X_ABS20_EXT_SRC
MOVX #X, R5 ; R_MSP430X_ABS20_EXT_SRC
MOVX R5, &Y ; R_MSP430X_ABS20_EXT_DST
MOVX #0xabcde, &Y ; R_MSP430X_ABS20_EXT_ODST (Y)
MOVX &X, &Y ; R_MSP430X_ABS20_EXT_SRC (X) and R_MSP430X_ABS20_EXT_ODST (Y)
MOVX #X, &Y ; R_MSP430X_ABS20_EXT_SRC (X) and R_MSP430X_ABS20_EXT_ODST (Y)
ADDX K(R4), R5 ; R_MSP430X_ABS20_EXT_SRC (K)
R_MSP430X_PCR20_EXT_SRC、R_MSP430X_PCR20_EXT_DST 和 R_MSP430X_PCR20_EXT_ODST 与 EXT20 重定位类型类似,区别是它们用于符号寻址模式。
MOVX X, R5 ; R_MSP430X_PCR20_EXT_SRC
MOVX R5, Y ; R_MSP430X_PCR20_EXT_DST
MOVX #0xabcde, Y ; R_MSP430X_PCR20_EXT_ODST (Y)
MOVX X, Y ; R_MSP430X_PCR20_EXT_SRC (X) and R_MSP430X_PCR20_EXT_ODST (Y)
R_MSP430X_PCR20_CALL 用于具有符号寻址模式的 CALLA:
CALLA Y ; R_MSP430X_PCR20_CALL
对于 R_MSP430X_PCR20_EXT_SRC、R_MSP430X_PCR20_EXT_DST、R_MSP430X_PCR20_EXT_ODST 和 R_MSP430X_PCR20_CALL,有效 PC 与重定位容器的地址不匹配。为了补偿这一点,汇编器必须根据差异来调整重定位加数。必须通过对 SRC 和 DST 添加 -4、对 ODST 添加 -6、对 CALL 添加 -2 来调整加数。
R_MSP430X_ABS20_ADR_SRC 和 R_MSP430X_ABS20_ADR_DST 用于绝对、索引和立即寻址模式,但仅限于 MSP430X。它们是不同的,因为它们在指令编码中编码不同的字段。SRC 重定位源操作数;DST 重定位目标操作数。CALLA 使用 DST。
MOVA &X, R5 ; R_MSP430X_ABS20_ADR_SRC
MOVA R5, &X ; R_MSP430X_ABS20_ADR_DST
MOVA #X, R5 ; R_MSP430X_ABS20_ADR_SRC
CALLA #X ; R_MSP430X_ABS20_ADR_DST
CALLA &X ; R_MSP430X_ABS20_ADR_DST
R_MSP430_ABS_HI16 用于加载 32 位链接器符号值。链接器符号值大于 20 位指针,因此不能使用单个指令加载整个值。此值必须拆分为两个重定位。此重定位类型表示值的 MSW。它用于与代表 LSW 的 R_MSP430_ABS16 成对使用。此重定位类型是合法的,但在 MSP430 上未使用。
示例:TI 编译器将从以下 C 代码生成此类重定位对:
extern char X;
unsigned long fn()
{
return _symval(&X);
}
MOV #$LO16(X), R12; R_MSP430_ABS16
MOV #$HI16(X), R13; R_MSP430_ABS_HI16