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修订历史记录

浮点行为

浮点行为因器件和工具链而异,因此难以标准化。ABI 旨在提供符合 C、C99 和 C++ 标准的基础。其中,在浮点方面,C99 是指定得最好的。C99 标准的附录 F 根据 IEEE 浮点标准(ISO IEC 60559:1989,之前指定为 ANSI/IEEE 754−1985)定义了 C 语言行为的浮点行为。

MSP430 ABI 指定:本节中操作浮点值的辅助函数必须符合 C99 标准附录 F 指定的行为。

C99 允许通过 <fenv.h> 标头文件定制和访问浮点行为环境。为标准化辅助函数的行为,ABI 指定其按照基本默认环境进行操作,并具有以下属性:

  • 舍入模式为舍入至最接近的值。不支持动态舍入精度模式。
  • 不支持浮点异常。
  • 表示信令 NaN 的输入行为类似于安静 NaN。
  • 辅助函数仅支持 FENV_ACCESS off 状态下的行为。也就是说,假设程序在不间断模式下执行,并且假设不访问浮点环境。

工具链使用自带库时可自由实现更完整的浮点支持。调用工具链特定浮点支持的用户可能需要使用该工具链的库(除了符合 ABI 的辅助函数库)进行链接。