• Menu
  • Product
  • Email
  • PDF
  • Order now
  • MSP430 嵌入式应用程序二进制接口

    • ZHCADC5A June   2013  – June 2020

       

  • CONTENTS
  • SEARCH
  • MSP430 嵌入式应用程序二进制接口
  1.   1
  2. 1 简介
    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. 2 数据表示
    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. 3 调用约定
    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. 4 数据分配和寻址
    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. 5 代码分配和寻址
    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. 6 辅助函数 API
    1. 6.1 浮点行为
    2. 6.2 C 辅助函数 API
    3. 6.3 辅助函数的特殊寄存器约定
    4. 6.4 C99 的浮点辅助函数
  8. 7 标准 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. 8 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. 9 异常处理
    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修订历史记录
  17. 重要声明
search No matches found.
  • Full reading width
    • Full reading width
    • Comfortable reading width
    • Expanded reading width
  • Card for each section
  • Card with all content

 

Application Note

MSP430 嵌入式应用程序二进制接口

本资源的原文使用英文撰写。 为方便起见,TI 提供了译文;由于翻译过程中可能使用了自动化工具,TI 不保证译文的准确性。 为确认准确性,请务必访问 ti.com 参考最新的英文版本(控制文档)。

1 简介

本文档是德州仪器 (TI) 的 MSP430 系列处理器的基于 ELF 的嵌入式应用二进制接口 (EABI) 规范。EABI 是宽泛的标准,定义了程序、程序组件和执行环境(如果存在操作系统,还包括操作系统)之间的低级别接口。EABI 的组件包括调用约定、数据布局和寻址约定、和目标文件格式。

本规范旨在使 MSP430 的工具提供商、软件提供商和用户能够构建彼此可互操作的工具和程序。

1.1 ABI - MSP430

在 TI 的 MSP430 编译器工具 4.0 版本发布之前,MSP430 的唯一 ABI 是基于 COFF 的原始 ABI。它严格上来说是一个裸机 ABI;没有执行级别的组件。

TI 编译器工具的 4.0 版本引入了一种名为 MSP430 EABI 的新 ABI。它基于 ELF 目标文件格式。它源自业界标准模型,包括 IA-64 C++ ABI 和用于 ELF 和动态链接的 System V ABI。ABI 的处理器特定方面(例如数据布局和调用约定)与 COFF ABI 相比基本没有变化,尽管存在一些差异。毋庸置疑,COFF ABI 和 EABI 是不兼容的;也就是说,给定系统中的所有代码都必须遵循相同的 ABI。TI 的编译器工具支持新的 EABI 和旧的 COFF ABI,但我们鼓励迁移到新的 ABI,因为未来可能会停止支持 COFF ABI。

平台 是程序运行所在的软件环境。ABI 具有特定于平台的方面,尤其是在与执行环境相关的约定领域,例如程序段的数量和使用、寻址约定、可见性约定、抢占、程序加载和初始化。目前裸机是唯一受支持的平台。裸机 一词表示不存在任何特定环境。这并不是说不能有操作系统,而是说没有特定于操作系统的 ABI 规范。换句话说,裸机 ABI 未涵盖程序的加载和运行方式以及它如何与系统的其他部分进行交互。

裸机 ABI 允许在许多具体方面存在很大的可变性。例如,实现可能提供位置独立性 (PIC),但如果给定系统不要求位置独立性,则这些约定不适用。由于这种可变性,程序可能仍然符合 ABI,但不兼容;例如,如果一个程序使用 PIC,但另一个程序不使用,则它们无法互操作。工具链应努力强制执行此类不兼容性。

1.2 范围

图 1-1 显示了 ABI 的组成部分及其关系。我们将从下到上简要描述图中的这些组成部分,并提供在此 ABI 规范中参考的相应章节。

底部区域的组成部分与目标级互操作性有关。

GUID-24AA0EBA-CB81-45F4-A9D2-E7BF06254A3D-low.png图 1-1 ABI 规范的组成部分

C 语言 ABI(Chapter2、Chapter3、Chapter4、Chapter5、Chapter6和Chapter7)规定了函数调用约定、数据类型表示、寻址约定和 C 运行时库的接口。

C++ ABI(Chapter8)规定了如何实现 C++ 语言;这包括有关虚拟函数表、名称改编、如何调用构造函数以及异常处理机制(Chapter9)的详细信息。MSP430 C++ ABI 基于流行的 IA-64 (Itanium) C++ ABI。

DWARF 组成部分(Chapter10)规定了目标级调试信息的表示。基本标准是 DWARF3 标准。此规范详细说明了处理器特定的扩展。

ELF 组成部分(Chapter11)规定了目标文件的表示。该规范为系统 V ABI 规范扩充了处理器特定的信息。

构建属性(Chapter13)是指一种将影响对象间兼容性的各种形参(如目标设备假设、内存模型或 ABI 变体)编码到目标文件中的方法。工具链可以使用构建属性来防止组合或加载不兼容的目标文件。

图中间区域的组成部分与执行时互操作性有关。

图 1-1 顶部的组成部分为 ABI 扩充了平台特定的约定,后者可以定义使可执行文件与执行环境兼容的要求,如程序段的数量和使用、寻址约定、可见性约定、抢占、程序加载和初始化。裸机是指缺失任何具体环境。

最后,有一组规范不是 ABI 的正式组成部分,但本文档进行了介绍以供参考,同时供其他工具链选择实现。

初始化(Chapter14)是指初始化变量赖以获取其初始值的机制。名义上,这些变量驻留在 .data 段中,在加载 .data 段时会直接将它们初始化,不需要工具额外参与。然而,TI 工具链支持一种机制,通过该机制,.data 段能够以压缩形式编码到目标文件中,并在启动时解压缩。这是一种通用机制的特殊用法,该机制以编程方式将压缩后的代码或数据从离线存储(例如 ROM)复制到其执行地址。我们将该过程称为复制表。虽然不是 ABI 的一部分,但本文档介绍了初始化和复制表机制,以便在需要时通过其他工具链使用。

1.3 ABI 变体

如前所述,ABI 并未定义所有情况下的具体行为,而是一套允许平台或系统特定变化的原则规范。ABI 中存在可以使用或不使用的模型变体。ABI 在使用此类变体的情况下对实现进行了标准化。有些变体彼此不兼容。如果任何对象使用特定的模型,则所有对象都必须使用。在这种情况下,工具链应使用构建属性来防止组合不兼容的对象。

  • 裸机 — 独立:此模型是指一个静态连接的自包含可执行文件。就互操作性而言,它是最简单的形式。ABI 的相关部分是图 1-1 下部的对象级别组件。由于可执行文件是静态链接和绑定(重定位)的,因此不需要位置独立性。

 

Texas Instruments

© Copyright 1995-2025 Texas Instruments Incorporated. All rights reserved.
Submit documentation feedback | IMPORTANT NOTICE | Trademarks | Privacy policy | Cookie policy | Terms of use | Terms of sale