为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子_第1页
为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子_第2页
为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子_第3页
为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子_第4页
为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

为了使单独编译的 C 语言程序和汇编程序之间能够相互调用 必须为子程序之间的调用规定一定的规则 ATPCS 就是 ARM 程序和 THUMB 程序中子程序调用的基本规则 一 ATPCS 概述 ATPCS 规定了一些子程序之间调用的基本规则 这些基本规则包括子程序调用过程中寄存器的使用 规则 数据栈的使用规则 参数的传递规则 为适应一些特定的需要 对这些基本的调用规则进行一些修改得 到几种不同的子程序调用规则 这些特定的调用规则包括 支持数据栈限制检查的 ATPCS 支持只读段位置无关的 ATPCS 支持可读写段位置无关的 ATPCS 支持 ARM 程序和 THUMB 程序混合使用的 ATPCS 处理浮点运算的 ATPCS 有调用关系的所有子程序必须遵守同一种 ATPCS 编译器或者汇编器在 ELF 格式的目标文件中设 置相应的属性 标识用户选定的 ATPCS 类型 对应不同类型的 ATPCS 规则 有相应的 C 语言库 连接器根 据用户指定的 ATPCS 类型连接相应的 C 语言库 使用 ADS 的 C 语言编译器编译的 C 语言子程序满足用户指定的 ATPCS 类型 而对于汇编语言程 序来说 完全要依赖用户来保证各子程序满足选定的 ATPCS 类型 具体来说 汇编语言子程序必须满足下 面三个条件 在子程序编写时必须遵守相应的 ATPCS 规则 数据栈的使用要遵守 ATPCS 规则 在汇编 编译器中使用 apcs 选项 二 基本 ATPCS 基本 ATPCS 规定了在子程序调用时的一些基本规则 包括以下三个方面的内容 各寄存器的使用规 则及其相应的名字 数据栈的使用规则 参数传递的规则 相对于其他类型的 ATPCS 满足基本 ATPCS 的程序的执行速度更快 所占用的内存更少 但是它不能提供以下的支持 ARM 程序和 THUMB 程序相 互调用 数据以及代码的位置无关的支持 子程序的可重入性 数据栈检查的支持 而派生的其他几种特 定的 ATPCS 就是在基本 ATPCS 的基础上再添加其他的规则而形成的 其目的就是提供上述的功能 寄存器的使用规则 1 子程序通过寄存器 R0 R3 来传递参数 这时寄存器可以记作 A0 A3 被调用的子程序在返回 前无需恢复寄存器 R0 R3 的内容 2 在子程序中 使用 R4 R11 来保存局部变量 这时寄存器 R4 R11 可以记作 V1 V8 如果在子 程序中使用到 V1 V8 的某些寄存器 子程序进入时必须保存这些寄存器的值 在返回前必须恢复这些寄存 器的值 对于子程序中没有用到的寄存器则不必执行这些操作 在 THUMB 程序中 通常只能使用寄存器 R4 R7 来保存局部变量 3 寄存器 R12 用作子程序间 scratch 寄存器 记作 ip 在子程序的连接代码段中经常会有这种使用 规则 4 寄存器 R13 用作数据栈指针 记做 SP 在子程序中寄存器 R13 不能用做其他用途 寄存器 SP 在 进入子程序时的值和退出子程序时的值必须相等 5 寄存器 R14 用作连接寄存器 记作 lr 它用于保存子程序的返回地址 如果在子程序中保存了返回 地址 则 R14 可用作其它的用途 6 寄存器 R15 是程序计数器 记作 PC 它不能用作其他用途 7 ATPCS 中的各寄存器在 ARM 编译器和汇编器中都是预定义的 数据栈的使用规则 栈指针通常可以指向不同的位置 当栈指针指向栈顶元素 即最后一个入栈的数据元素 时 称为 FULL 栈 当栈指针指向与栈顶元素相邻的一个元素时 称为 Empty 栈 数据栈的增长方向也可以不同 当数据 栈向内存减小的地址方向增长时 称为 Descending 栈 当数据栈向着内存地址增加的方向增长时 称为 Ascending 栈 综合这两种特点可以由以下 4 种数据栈 FD ED FA EA ATPCS 规定数据栈为 FD 类型 并 对数据栈的操作是 8 字节对齐的 下面是一个数据栈的示例及相关的名词 1 数据栈栈指针 stack pointer 指向最后一个写入栈的数据的内存地址 2 数据栈的基地址 stack base 是指数据栈的最高地址 由于 ATPCS 中的数据栈是 FD 类型的 实际 上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元 3 数据栈界限 stack limit 是指数据栈中可以使用的最低的内存单元地址 4 已占用的数据栈 used stack 是指数据栈的基地址和数据栈栈指针之间的区域 其中包括数据栈栈 指针对应的内存单元 5 数据栈中的数据帧 stack frames 是指在数据栈中 为子程序分配的用来保存寄存器和局部变量 的区域 异常中断的处理程序可以使用被中断程序的数据栈 这时用户要保证中断的程序数据栈足够大 使用 ADS 编译器产生的目标代码中包含了 DRFAT2 格式的数据帧 在调试过程中 调试器可以使用这些数据 帧来查看数据栈中的相关信息 而对于汇编语言来说 用户必须使用 FRAME 伪操作来描述数据栈中的数 据帧 ARM 汇编器根据这些伪操作在目标文件中产生相应的 DRFAT2 格式的数据帧 在 ARMv5TE 中 批量传送指令 LDRD STRD 要求数据栈是 8 字节对齐的 以提高数据的传送速度 用 ADS 编译器产生的目标文件中 外部接口的数据栈都是 8 字节对齐的 并且编译器将告诉连接器 本目 标文件中的数据栈是 8 字节对齐的 而对于汇编程序来说 如果目标文件中包含了外部调用 则必须满足以 下条件 外部接口的数据栈一定是 8 位对齐的 也就是要保证在进入该汇编代码后 直到该汇编程序调用 外部代码之间 数据栈的栈指针变化为偶数个字 在汇编程序中使用 PRESERVE8 伪操作告诉连接器 本汇 编程序是 8 字节对齐的 参数的传递规则 根据参数个数是否固定 可以将子程序分为参数个数固定的子程序和参数个数可变的子程序 这两种子 程序的参数传递规则是不同的 1 参数个数可变的子程序参数传递规则 对于参数个数可变的子程序 当参数不超过 4 个时 可以使用寄存器 R0 R3 来进行参数传递 当参数 超过 4 个时 还可以使用数据栈来传递参数 在参数传递时 将所有参数看做是存放在连续的内存单元中的 字数据 然后 依次将各名字数据传送到寄存器 R0 R1 R2 R3 如果参数多于 4 个 将剩余的字数据传送 到数据栈中 入栈的顺序与参数顺序相反 即最后一个字数据先入栈 按照上面的规则 一个浮点数参数可以 通过寄存器传递 也可以通过数据栈传递 也可能一半通过寄存器传递 另一半通过数据栈传递 2 参数个数固定的子程序参数传递规则 对于参数个数固定的子程序 参数传递与参数个数可变的子程序参数传递规则不同 如果系统包含浮点 运算的硬件部件 浮点参数将按照下面的规则传递 各个浮点参数按顺序处理 为每个浮点参数分配 FP 寄 存器 分配的方法是 满足该浮点参数需要的且编号最小的一组连续的 FP 寄存器 第一个整数参数通过寄存 器 R0 R3 来传递 其他参数通过数据栈传递 子程序结果返回规则 1 结果为一个 32 位的整数时 可以通过寄存器 R0 返回 2 结果为一个 64 位整数时 可以通过 R0 和 R1 返回 依此类推 3 结果为一个浮点数时 可以通过浮点运算部件的寄存器 f0 d0 或者 s0 来返回 4 结果为一个复合的浮点数时 可以通过寄存器 f0 fN 或者 d0 dN 来返回 5 对于位数更多的结果 需要通过调用内存来传递 三 几种特定的 ATPCS A 支持数据栈限制检查的 ATPCS 如果在程序设计期间能够准确地计算出程序所需的内存总量 就不需要进行数据栈的检查 但是在通 常情况下这是很难做到的 这时需要进行数据栈的检查 在进行数据栈的检查时 使用寄存器 R10 作为数据 栈限制指针 这时寄存器 R10 又记作 sl 用户在程序中不能控制该寄存器 具体来说 支持数据栈限制的 ATPCS 要满足下面的规则 在已经占有的栈的最低地址和 sl 之间必须有 256 字节的空间 也就是说 sl 所指的内存地址必须比已经占用的栈的最低地址低 256 个字节 当中断处理程序可以使用用户的数据栈时 在已经占用的栈的最低地址和 sl 之间除了必须保留的 256 个字节的内存单元外 还必须为中断处理预留足 够的内存空间 用户在程序中不能修改 sl 的值 数据栈栈指针 sp 的值必须不小于 sl 的值 与支持数据栈限制检查的 ATPCS 相关的编译 汇编选项有下面几种 选项 SWST 指示编译器生成 的代码遵守支持数据栈限制检查的 ATPCS 用户在程序设计期间不能够准确计算程序所需的数据栈大小时 需 要指定该选项 选项 noswst 指示编译器生成的代码不支持数据栈限制检查的功能 用户在程序设计期间能 够准确计算出程序所需的数据栈大小 可以指定该选项 这个选项是默认的 选项 SWSTNA 如果汇编程序 对于是否进行数据栈检查无所谓 而与该汇编程序连接的其他程序指定了选项 swst noswst 这时使用该 选项 编写遵守支持数据栈限制检查的 ATPCS 的汇编语言程序 对于 C 程序和 C 程序来说 如果在编译时指定了选项 SWST 生成的目标代码将遵守支持数据栈 限制检查的 ATPCS 对于汇编语言程序来说 如果要遵守支持数据栈限制检查的 ATPCS 用户在编写程 序时必须满足支持数据栈限制检查的 ATPCS 所要求的规则 然后指定选项 SWST 下面介绍用户编写汇 编语言程序时的一些要求 叶子子程序是指不调用别的程序的子程序 数据栈小于 256 字节的叶子子程序不许要进行数据栈检查 如果几个子程序组合起来构成的叶子子程 序数据栈也小于 256 字节 这个规则同样适用 数据栈小于 256 字节的非叶子子程序可以使用下面的代码 段来进行数据栈检查 ARM 程序使用 SUB sp sp size size 为 sp 和 sl 之间必须保留的空间大小 CMP sp sl BLLO ARM stack overflow THUMB 程序使用 ADD sp size size 为 sp 和 sl 之间必须保留的空间大小 CMP sp sl BLLO THUMB stack overflow 数据栈大于 256 字节的子程序 为了保证 sp 的值不小于数据栈可用的内存单元最小的地址值 需要引 入相应的寄存器 ARM 程序使用下列代码 SUB ip sp size CMP ip sl BLLO ARM stack overflow THUMB 程序使用下列代码 LDR wr size ADD wr sp CMP wr sl BLLO THUMB stack overflow 支持只读段位置无关的 ATPCS 支持可读写段位置无关的 ATPCS 支持 ARM 程序和 THUMB 程序混合使用的 ATPCS 在编译或汇编时 使用 intework 告诉编译器或汇编器生成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论