ZHCADC5A June 2013 – June 2020
表 11-6 提供了有关如何编码和执行每个重定位的详细信息。此表使用以下表示法:
F | 可重定位字段。此字段使用元组 [CS, O, FS] 指定,其中 CS 是容器大小,O 是从容器的 LSB 到字段的 LSB 的起始偏移量,FS 是字段的大小。所有值均以位数表示。表示法 [x,y]+[z,w] 指示重定位占用不连续的位范围,应将其连接在一起以形成字段。当加数列中使用“F”时,表示此字段已具有地址空间的准确大小。 |
R | 重定位操作的算术结果 |
EV | 要存储回重定位字段的编码值 |
SE(x) | x 的符号扩展值。从概念上讲,符号扩展是针对地址空间的宽度执行的。 |
ZE(x) | x 的零扩展值。从概念上讲,零扩展是针对地址空间的宽度执行的。 |
r_addend | 加数必须存储在 RELA 字段中,并且不能存储在重定位容器中。 |
对于启用了溢出检查的重定位类型,如果编码值(包括其符号,如果有)无法编码到可重定位字段中,则会发生溢出。即:
重定位名称 | 符号 | 容器大小 (CS) | 字段 [O, FS] (F) | 加数 (A) | 结果 (R) | 溢出检查 | 编码值 (EV) |
R_MSP430_NONE | 无 | 32 | [0,32] | 无 | 无 | 否 | 无 |
R_MSP430_ABS32 | 任一 | 32 | [0,32] | F | S + A | 否 | R |
R_MSP430_ABS16 | 任一 | 16 | [0,16] | SE(F) | S + A | 否 | R |
R_MSP430_ABS8 | 任一 | 8 | [0,8] | SE(F) | S + A | 是 | R |
R_MSP430_PCR16 | 有符号 | 16 | [0,16] | SE(F) | S + A - P | 否 | R |
R_MSP430X_PCR20_EXT_SRC | 有符号 | 48 | [7,4]+[32,16] | SE(F) | S + A - P | 是 | R |
R_MSP430X_PCR20_EXT_DST | 有符号 | 48 | [0,4]+[32,16] | SE(F) | S + A - P | 是 | R |
R_MSP430X_PCR20_EXT_ODST | 有符号 | 64 | [0,4]+[48,16] | SE(F) | S + A - P | 是 | R |
R_MSP430X_ABS20_EXT_SRC | 无符号 | 48 | [7,4]+[32,16] | ZE(F) | S + A | 是 | R |
R_MSP430X_ABS20_EXT_DST | 无符号 | 48 | [0,4]+[32,16] | ZE(F) | S + A | 是 | R |
R_MSP430X_ABS20_EXT_ODST | 无符号 | 64 | [0,4]+[48,16] | ZE(F) | S + A | 是 | R |
R_MSP430X_ABS20_ADR_SRC | 无符号 | 32 | [8,4]+[16,16] | ZE(F) | S + A | 是 | R |
R_MSP430X_ABS20_ADR_DST | 无符号 | 32 | [0,4]+[16,16] | ZE(F) | S + A | 是 | R |
R_MSP430X_PCR16 | 有符号 | 16 | [0,16] | SE(F) | S + A - P | 是 | R |
R_MSP430X_PCR20_CALL | 有符号 | 32 | [0,4]+[16,16] | SE(F) | S + A - P | 是 | R |
R_MSP430X_ABS16 | 无符号 | 16 | [0,16] | SE(F) | S + A | 是 | R |
R_MSP430_ABS_HI16 | 无 | 16 | [0,16] | r_addend | S + A | 否 | R >> 16 |
R_MSP430_PREL31 | 有符号 | 32 | [0,31] | SE(F) | S + A - P | 否 | R >> 1 |
*请参阅节 11.5.1.4。