ZHCADC5A June   2013  – June 2020

 

  1.   1
  2. 简介
    1. 1.1  ABI - MSP430
    2. 1.2  范围
    3. 1.3  ABI 变体
    4. 1.4  工具链和互操作性
    5. 1.5 
    6. 1.6  目标文件的类型
    7. 1.7 
    8. 1.8  MSP430 架构概述
    9. 1.9  MSP430 存储器模型
    10. 1.10 参考文档
    11. 1.11 代码片段表示法
  3. 数据表示
    1. 2.1 基本类型
    2. 2.2 寄存器中的数据
    3. 2.3 存储器中的数据
    4. 2.4 指针类型
    5. 2.5 复数类型
    6. 2.6 结构体和联合体
    7. 2.7 数组
    8. 2.8 位字段
      1. 2.8.1 易失性位字段
    9. 2.9 枚举类型
  4. 调用约定
    1. 3.1 调用和返回
      1. 3.1.1 调用指令
        1. 3.1.1.1 间接调用
        2. 3.1.1.2 直接调用
      2. 3.1.2 返回指令
      3. 3.1.3 流水线约定
      4. 3.1.4 弱函数
    2. 3.2 寄存器惯例
      1. 3.2.1 实参寄存器
      2. 3.2.2 被调用者保存的寄存器
    3. 3.3 实参传递
      1. 3.3.1 单个寄存器
      2. 3.3.2 寄存器对
      3. 3.3.3 拆分对
      4. 3.3.4 四倍字(四寄存器实参)
      5. 3.3.5 编译器辅助函数的特殊约定
      6. 3.3.6 C++ 实参传递
      7. 3.3.7 传递结构体和联合体
      8. 3.3.8 未在寄存器中传递的实参的栈布局
      9. 3.3.9 帧指针
    4. 3.4 返回值
    5. 3.5 通过引用传递并返回的结构体和联合体
    6. 3.6 编译器辅助函数的约定
    7. 3.7 已见函数的暂存寄存器
    8. 3.8 _ _mspabi_func_epilog 辅助函数
    9. 3.9 中断函数
  5. 数据分配和寻址
    1. 4.1 数据段和数据区段
    2. 4.2 寻址模式
    3. 4.3 静态数据的分配和寻址
      1. 4.3.1 静态数据的寻址方法
        1. 4.3.1.1 绝对寻址
        2. 4.3.1.2 符号寻址
        3. 4.3.1.3 立即寻址
      2. 4.3.2 静态数据的放置约定
        1. 4.3.2.1 放置的抽象约定
        2. 4.3.2.2 寻址的抽象约定
      3. 4.3.3 静态数据的初始化
    4. 4.4 自动变量
    5. 4.5 帧布局
      1. 4.5.1 栈对齐
      2. 4.5.2 寄存器保存顺序
    6. 4.6 堆分配对象
  6. 代码分配和寻址
    1. 5.1 计算代码标签的地址
      1. 5.1.1 代码的绝对寻址
      2. 5.1.2 符号寻址
      3. 5.1.3 立即寻址
    2. 5.2 分支
    3. 5.3 调用
      1. 5.3.1 直接 调用
      2. 5.3.2 Far Call Trampoline
      3. 5.3.3 间接调用
  7. 辅助函数 API
    1. 6.1 浮点行为
    2. 6.2 C 辅助函数 API
    3. 6.3 辅助函数的特殊寄存器约定
    4. 6.4 C99 的浮点辅助函数
  8. 标准 C 库 API
    1. 7.1  保留符号
    2. 7.2  <assert.h> 实现
    3. 7.3  <complex.h> 实现
    4. 7.4  <ctype.h> 实现
    5. 7.5  <errno.h> 实现
    6. 7.6  <float.h> 实现
    7. 7.7  <inttypes.h> 实现
    8. 7.8  <iso646.h> 实现
    9. 7.9  <limits.h> 实现
    10. 7.10 <locale.h> 实现
    11. 7.11 <math.h> 实现
    12. 7.12 <setjmp.h> 实现
    13. 7.13 <signal.h> 实现
    14. 7.14 <stdarg.h> 实现
    15. 7.15 <stdbool.h> 实现
    16. 7.16 <stddef.h> 实现
    17. 7.17 <stdint.h> 实现
    18. 7.18 <stdio.h> 实现
    19. 7.19 <stdlib.h> 实现
    20. 7.20 <string.h> 实现
    21. 7.21 <tgmath.h> 实现
    22. 7.22 <time.h> 实现
    23. 7.23 <wchar.h> 实现
    24. 7.24 <wctype.h> 实现
  9. C++ ABI
    1. 8.1  限制 (GC++ABI 1.2)
    2. 8.2  导出模板 (GC++ABI 1.4.2)
    3. 8.3  数据布局(GC++ABI 第 2 章)
    4. 8.4  初始化保护变量 (GC++ABI 2.8)
    5. 8.5  构造函数返回值 (GC++ABI 3.1.5)
    6. 8.6  一次性构建 API (GC++ABI 3.3.2)
    7. 8.7  控制对象构造顺序 (GC++ ABI 3.3.4)
    8. 8.8  还原器 API (GC++ABI 3.4)
    9. 8.9  静态数据 (GC++ ABI 5.2.2)
    10. 8.10 虚拟表和键函数 (GC++ABI 5.2.3)
    11. 8.11 回溯表位置 (GC++ABI 5.3)
  10. 异常处理
    1. 9.1  概述
    2. 9.2  PREL31 编码
    3. 9.3  异常索引表 (EXIDX)
      1. 9.3.1 指向行外 EXTAB 条目的指针
      2. 9.3.2 EXIDX_CANTUNWIND
      3. 9.3.3 内联 EXTAB 条目
    4. 9.4  异常处理指令表 (EXTAB)
      1. 9.4.1 EXTAB 通用模型
      2. 9.4.2 EXTAB 紧凑模型
      3. 9.4.3 个性化例程
    5. 9.5  回溯指令
      1. 9.5.1 通用序列
      2. 9.5.2 字节编码展开指令
    6. 9.6  描述符
      1. 9.6.1 类型标识符编码
      2. 9.6.2 作用域
      3. 9.6.3 Cleanup 描述符
      4. 9.6.4 catch 描述符
      5. 9.6.5 函数异常规范 (FESPEC) 描述符
    7. 9.7  特殊段
    8. 9.8  与非 C++ 代码交互
      1. 9.8.1 EXIDX 条目自动生成
      2. 9.8.2 手工编码的汇编函数
    9. 9.9  与系统功能交互
      1. 9.9.1 共享库
      2. 9.9.2 覆盖块
      3. 9.9.3 中断
    10. 9.10 TI 工具链中的汇编语言运算符
  11. 10DWARF
    1. 10.1 DWARF 寄存器名称
    2. 10.2 调用帧信息
    3. 10.3 供应商名称
    4. 10.4 供应商扩展
  12. 11ELF 目标文件(处理器补充)
    1. 11.1 注册供应商名称
    2. 11.2 ELF 标头
    3. 11.3
      1. 11.3.1 段索引
      2. 11.3.2 段类型
      3. 11.3.3 扩展段标头属性
      4. 11.3.4 子段
      5. 11.3.5 特殊段
      6. 11.3.6 段对齐
    4. 11.4 符号表
      1. 11.4.1 符号类型
      2. 11.4.2 通用块符号
      3. 11.4.3 符号名称
      4. 11.4.4 保留符号名称
      5. 11.4.5 映射符号
    5. 11.5 重定位
      1. 11.5.1 重定位类型
        1. 11.5.1.1 绝对重定位
        2. 11.5.1.2 PC 相对重定位
        3. 11.5.1.3 数据段中的重定位
        4. 11.5.1.4 MSP430 指令的重定位
        5. 11.5.1.5 MSP430X 指令的重定位
        6. 11.5.1.6 其他重定位类型
      2. 11.5.2 重定位操作
      3. 11.5.3 未解析的弱引用的重定位
  13. 12ELF 程序加载和链接(处理器补充)
    1. 12.1 程序标头
      1. 12.1.1 基址
      2. 12.1.2 段内容
      3. 12.1.3 线程局部存储
    2. 12.2 程序加载
  14. 13构建属性
    1. 13.1 MSP430 ABI 构建属性子段
    2. 13.2 MSP430 构建属性标签
  15. 14复制表和变量初始化
    1. 14.1 复制表格式
    2. 14.2 压缩的数据格式
      1. 14.2.1 RLE
      2. 14.2.2 LZSS 格式
    3. 14.3 变量初始化
  16. 15修订历史记录

MSP430X 指令的重定位

有关在 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