ATPCS:ARM-Thumb程序调用的基本规则

news2024/12/23 23:12:00

        为了使单独编译的c文件和汇编文件之间能够互相调用,需要制定一系列的规则,AAPCS就是ARM程序和Thumb程序中子程序调用的基本规则。

1、ATPCS概述

        ATPCS规定了子程序调用过程中寄存器的使用规程、数据站的使用规则、参数的传递规则。为了适应一些特殊的需求,对这些规则进行改动可以得到几种不同的子程序调用规则,具体包括:

  • 支持数据栈限制检查的ATPCS

  • 支持只读段位置无关(ROPI)的ATPCS

  • 支持可读写段位置无关(RWPI)的ATPCS

  • 支持ARM程序和Thumb程序混合使用的ATPCS

  • 处理浮点运算的ATPCS

        相关调用程序必须遵守同一种ATPCS,编译器/汇编器在ELF格式的目标文件中设置相应的属性,标识用户选定 ATPSC类型。不同类型的ATPCS规则,有对应的C语言库,连接器根据用户的指定ATPCS类型链接相应的c库。

        C语言的编译器编译的C子程序能够满足用户指定的ATPCS类型。而对于汇编语言,需要用户来满足子程序间的ATPCS类型。汇编子程序必须满足如下三个条件:

  • 子程序编写时必须遵守相应的ATPCS规则

  • 数据栈的使用要遵守相应的ATPCS规则

  • 汇编器中使用-apcs选项

    下面是keil中,C语言配置的选项。

下面是汇编器的配置。

2、基本ATPCS

基本的ATPCS规则包括下面三个方面内容:

  • 各寄存器的使用规则及其相应的名称

  • 数据栈的使用规则

  • 参数传递的规则

满足基本类型的ATPCS程序运行速度更快,占用内存更少,但不支持以下功能:

  • ARM程序和Thumb程序的互相调用(注:在Cortex-M3中使用的是Thumb2指令,已经不区分ARM、Thumb指令了,《Cortex-M3权威手册》对此有论述。因此,该条存疑,本文参考的资料也较老,新版可能会更改,待验证。。。。)

  • 数据以及代码的位置无关的支持

  • 子程序的可重入性

  • 数据栈检查的支持

        派生的几种ATPCS规则是在基本的ATPCS基础上添加额外规则形成的,目的就是提供上述功能。

2.1 寄存器的使用规则

   寄存器的使用必须满足如下规则:

  • 子程序间通过R0--R3传递参数,被调用的子程序在返回前无需恢复寄存器R0--R3的内容。

  • 在子程序中,使用R4--R11保存局部变量,如果在子程序中使用到了寄存器R4--R11中的某些寄存器,子程序进入前需要保存这些寄存器的值,在返回时需要恢复。未用到,不处理。在Thumb程序中,通常只能使用寄存器R4--R7来保存局部变量。

  • 寄存器R12用作子程序间scratch寄存器,记作ip。在子程序间的连接代码段中常用这种使用规则。

  • 寄存器R13用作数据栈指针,记作sp。在子程序中sp不能用作其它用途,进入子程序时的sp值和退出子程序时的sp值必须相等。

  • R14称为连接寄存器,记作lr。用于保存子程序的返回地址,如果在子程序中保存了返回地址,R14可以用作其它的用途。

  • R15是程序计数器,记作pc,不能用于其它的用途。

ATPCS中各寄存器的使用规则及其名称

寄存器    别名特殊名称使用规则
R15Pc程序计数器
R14Lr连接寄存器
R13Sp数据栈指针
R12Ip子程序内部调用的scratch寄存器
R11V8ARM状态局部变量寄存器8
R10V7sl

ARM状态局部变量寄存器7

在支持数据栈检查的ATPCS中为数据栈限制指针

R9V6sb

ARM状态局部变量寄存器6

在支持RWPI的ATPCS中为静态基址寄存器

R8V5ARM状态局部变量寄存器5
R7V4wr

局部变量寄存器4

Thumb状态工作寄存器

R6V3局部变量寄存器3
R5V2局部变量寄存器2
R4V1局部变量寄存器1
R3A4参数/结果/scratch 寄存器4
R2A3参数/结果/scratch 寄存器3
R1A2参数/结果/scratch 寄存器2
R0A1参数/结果/scratch 寄存器1

2.2 数据栈的使用规则

        栈指针通常可以指向不同的位置。当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为FULL栈;当栈指针指向与栈顶指针(即最后一个入栈的数据元素)相邻的一个可用数据单元时,称为EMPTY栈。

        栈的增长方式也可以不同,向内存地址减小的方向增长时,称为DESCENDING栈,向地址增长的方向增长时,称为ASCENDING栈。故,有四种栈:

  • FD FULL DESCENDING
  • ED EMPTY DESCENDING
  • FA FULL ASCENDING
  • EA EMPTY ASCENDING

        ATPCS规定数据栈为FD栈,并且数据栈的操作时8 Byte对齐。下面时数据栈的示例和名词解释。

  • 数据栈栈指针(stack pointer)是指最后一个写入栈的数据的内存地址。
  • 数据栈的基地址(stack base)是指数据栈的最高地址。由于ATPCS中数据栈式FD类型,实际上数据栈中最早入栈的数据占据的内存单元式基地址的下一个内存单元。
  • 数据栈界限(stack limit)是指数据栈可以使用的最低的内存单元的地址。
  • 已占用的数据栈(used stack)是指数据栈的基地址和数据栈栈指针之间的区域。其中包括数据栈栈指针对应的内存单元,但不包括数据栈的基地址对应的内存单元。
  • 未占用的数据栈(unused stack)是指数据栈栈指针和数据栈界限之间的区域,其中包括数据栈界限对应的内存单元,但不包括数据栈栈指针对应的内存单元。
  • 数据栈中的数据帧(stack frames)是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域。

        异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序的数据栈足够大。

数据栈的示意图

        在ARMv5RE(很老的版本了,cortex-m3式ARMv7版本)中,批量传输指令LDRD/STRD要求的数据栈是8 Byte对齐,以提高数据的传输速度。用ADS编译器产生的目标文件中,外部接口的数据栈都是8 Byte对齐的,并且编译器告诉连接器:本目标文件的数据栈是8字节对齐的,对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:

  • 外部接口的数据栈必须是8字节对齐,保证在进入该汇编代码后,知道该汇编代码调用外部程序之间,数据栈的栈指针变化的是偶数个字(如栈指针加2个字,而非3个字)。
  • 汇编程序中使用PRESERVE8位操作告诉连接器,本汇编程序数据栈是8字节对齐的。

2.3 参数传递规则

        根据参数个数是否固定可以将子程序分为参数个数固定的子程序和参数个数可变的子程序,二者的参数传递规则不同。

2.3.1 参数个数可变的子程序参数传递规则(少见,对应C中的可变参数)

        当参数不超过4个时,可以使用寄存器R0--R3来传递参数,超过4个,还可以使用数据栈来传递参数。

        参数传递时,将所有参数看作时存放在连续的内存字单元中的字数据,然后,依次将各字数据传送到寄存器R0--R3中,如果大于4个,将剩余的字数据传送到数据栈中,入栈顺序与参数顺序相反。

        按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递。

2.3.2 参数不可变的子程序传递规则(常见,大部分C语言的情况)

        如果系统包含了浮点运算的硬件部件,浮点参数将按照下面的规则传递:

  • 各个浮点参数按顺序处理
  • 为每个浮点参数分配FP寄存器
  • 分配的方法:满足该浮点参数需要的且编号最小的一组连续FP寄存器

        第一个整数参数,通过R0--R3传输,其余的参数按照数据栈传输。

2.3.3 子程序结果返回规则

子程序中结果返回的规则如下:

  • 结果为一个32位整数时,可以通过R0返回.
  • 结果为一个64位整数时,可以通过R0、R1返回,以此类推。
  • 结果位一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0返回
  • 结果为复合型的浮点数(如复数)时,可以通过寄存器f0--fN或者d0--dN来返回。
  • 对于位数更多的结果,需要通过内存来传递。

3 几种特定的ATPCS

        几种特定的ATPCS是在基本的ATPCS基础上增加一些规则形成的:

  • 支持数据栈限制检查的ATPCS

  • 支持只读段位置无关(ROPI)的ATPCS

  • 支持可读写段位置无关(RWPI)的ATPCS

  • 支持ARM程序和Thumb程序混合使用的ATPCS

  • 处理浮点运算的ATPCS

3.1 支持数据栈限制检查的ATPCS

 3.1.1 支持数据栈限制检查的ATPCS基本原理

        如果在程序设计期间能够准确计算程序用到的内存大小,就不需要进行数据栈检查,但这在一般情况下很难做到,这时就需要进行数据栈的检查。

        在进行数据栈的检查时,使用R10(又记作sl)作为数据栈限制指针。用户在程序中不能使用该寄存器。支持数据栈限制检查的ATPCS要满足下面的规则:

  • 在已占用的栈的最低地址和sl之间必须有256字节的空间。即sl所指的内存地址必须比已经占用的栈的最低地址低256字节。当中断处理程序可以使用用户的数据栈时,在已经占用的栈的最低地址和sl之间除了必须保留的256字节的内存单元之外,还必须为中断处理预留足够的内存空间。
  • 用户程序不能修改sl的值
  • 数据栈栈指针sp的值必须不小于sl的值

与支持数据栈限制检查的ATPCS相关的编译/汇编选项有下面几种:

  • 选项/swst(software  stack limit checking)指示编译器生成的代码遵守支持数据栈限制检查的ATPCS。用户在程序设计期间不能准确计算出程序所需的所有数据栈大小时,需要指定该选项。
  • 选项/noswst(no software  stack limit checking)指示编译器生成的代码不支持数据栈限制检查功能。用户在程序设计期间能准确计算出程序所有的所有数据栈大小时,可以指定该选项,默认该选项。
  • 选项/swstna(software  stack limit checking not  applicable)如果汇编程序对于是否进行数据栈检查无所谓,而与该汇编程序连续的其它程序指定了选项/swst或选项/noswst,这时该汇编程序使用选项/swstna

 3.1.2 编写遵守支持数据栈限制检查的ATPCS的汇编语言程序

        对于C或者C++来说,如果在编译时指定swst选项,生成的目标代码将遵守支持数据栈限制检查的ATPCS。

        对于汇编程序来说,如果要遵守支持数据栈限制检查的ATPCS,用户在编写程序时,必须满足支持数据栈限制检查的ATPCS所要求的规则。然后在汇编时指定选项swst。

3.2 支持只读段位置无关(ROPI)的ATPCS

3.2.1 支持只读段位置无关的ATPCS的应用场合

        位置无关的只读段可能为位置无关的代码段,也可能是只读数据段。使用 支持只读段位置无关的ATPCS可以避免必须将程序存放到特定的位置。常用于:

  • 程序在运行期间动态加载到内存中。
  • 程序在不同的场合,与不同的程序组合后加载到内存中。
  • 在运行期间映射到不同的地址。在一些嵌入式系统中,将程序放到ROM中,运行时再加载到RAM中的不同地址(Linux常用这种方式,uboot加载Linux内核镜像文件到RAM中)。

3.2.2 支持只读段位置无关的ATPCS的程序设计

如果程序遵守支持只读段位置无关的ATPCS,需要满足如下规则:

  • 当ROPI段中的代码引用同一个ROPI段中的符号时,必须是基于PC的。
  • 当ROPI段中的代码引用另一个ROPI段中的符号时,必须是基于PC的。并且两个ROPI段的位置关系必须固定。
  • 其它被ROPI段中的代码引用的必须是绝对地址,或基于sb的可写数据。
  • ROPI段移动后,对ROPI中符号的引用要作相应的调整。

3.3 支持可读写段位置无关(RWPI)的ATPCS

        如果一个程序中所有的可读写段都是位置无关,则称该程序遵守支持可读写段位置无关(RWPI)的ATPCS。使用支持可读写段位置无关的ATPCS可以避免必须将程序放到特定的位置。这时,R9通常用作静态基址寄存器,记作sb。可重入的子程序可以再内存中同时有多个实例,各个实例拥有独立的可读写段。在生成一个新的实例时,sb指向该实例的可读写段。RWPI段中的符号的计算方法为:连接器首先计算出该符号相对于RWPI段中某一特定位置的偏移量,通常该特定位置选为RWPI段的第一个字节处:在程序运行时,将该偏移量加上sb即可生成该符号的地址。

3.4 支持ARM程序和Thumb程序混合使用的ATPCS

        据《Cortex-M3权威手册》中所述,Cortex-M3已经不再区分ARM指令和Thumb指令,M3中使用的时Thumb2指令集,Thumb2指令集兼容32位和16位指令,因此,该部分在目前已经用不到,就不再叙述。

3.5 处理浮点运算的ATPCS

        ATPCS支持VFP体系和FPA体系两种不同的浮点硬件体系和指令集,两种体系对应的代码不兼容。

        相应的,ADS的编译器和汇编器有下面6种与浮点数相关的选项。

  • -fpu  VFP
  • -fpu  FPA
  • -fpu  softVFP
  • -fpu  softVFP + VFP
  • -fpu  softFPA
  • -fpu  none

        当系统种包含浮点运算部件时,可以选择上述选项。在M3内核种不包含浮点数运算单元,但M4内核中包含一个可选的浮点数运算单元(FPU),FPU符合IEEE 754标准(未实现完整的内容)。FPU为单精度浮点单元,浮点数据和计算基于IEEE Std 754-2008,IEEE二进制浮点运算标准,是VFP体系。

4 说明

        本篇文章参考了《ARM体系结构与编程》(杜春雷  著)和《Cortex-M3权威指南》,属于学习笔记性质。参考资料链接:https://gitee.com/zichuanning520/htq_library

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1120993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MIT 6.S081 FALL 2020环境搭建

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 MIT6.S081 Operating System Engineering 是麻省理工学院计算机科学本科的中级课程&#xff0c…

openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员

文章目录 openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员106.1 初始用户106.2 系统管理员106.3 安全管理员106.4 审计管理员106.5 监控管理员106.6 运维管理员106.7 安全策略管理员 openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员 10…

按键中断控制LED灯亮灭

EXTI—外部中断/事件控制器 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可…

MyBatis整合Spring的原理分析

MyBatis整合Spring的原理分析 http://mybatis.org/spring/zh/index.html 1. MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作。1.1 添加相关的依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifa…

面试官:说说Vue 3.0中Treeshaking特性?

一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#xff0c;传统的方式是把鸡…

石油数字孪生可视化管理平台,推动石油行业数字化转型与智能化应用

随着科技的飞速发展&#xff0c;如何利用先进的信息技术全面增强智能制造过程中感知、处理、决策、执行的能力&#xff0c;成为当前石油化工信息化数字化变革的研究重点&#xff0c;而数字孪生可视化管理平台具有高效的决策分析特点&#xff0c;将有力地推动数字化转型与智能化…

函数模板和类模板实例介绍

模板&#xff1a;将类型定义为参数&#xff0c;实现类型参数化&#xff0c;实现代码重用。 一、函数模板 格式&#xff1a; &#xff08;template-声明模板的关键字&#xff0c;class修饰形参类型&#xff09; template <class / typename T> 返回类型 函数名&#xff…

qDebug().noquote()、qDebug().nospace()和 DEFINES+= QT_NO_DEBUG_OUTPUT作用

qDebug().noquote() qDebug().noquote() 和输出有关系。 qDebug() 是 Qt 的调试输出函数&#xff0c;用于在调试模式下输出信息。 默认情况下&#xff0c;qDebug() 会自动为输出的字符串添加引号。使用 .noquote() 可以禁用这个特性&#xff0c;输出的字符串将不再包含引号。…

【Linux】操作系统的认识

操作系统 1. 冯诺依曼体系结构2. 操作系统 1. 冯诺依曼体系结构 冯诺依曼体系结构的介绍 冯.诺依曼结构消除了原始计算机体系中&#xff0c;只能依靠硬件控制程序的状况&#xff08;程序作为控制器的一部分&#xff0c;作为硬件存在&#xff09;&#xff0c;将程序编码存储在…

Python面向对象丨面向过程和面向对象,你真的了解“对象”吗?

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

51单片机练习(04)

eg1:使用定时器的方式实现单片机流水灯 #include <REGX52.H> #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int uchar temp,t0;// 初始化函数 void init(){temp 0xfe;//第一个发光二级管点亮P1 temp;// 初始化定时器TMOD 0x11;TH0…

网络协议--IP选路

9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生&#xff0c;也可以由其他主机产生。在后一种情况下&#xff0c;主机必须配置成一个路由器&#xff0c;否则通过网络接口接收到的数据报&#xff0c;如果目的地址不…

游戏盾如何有效防护DDoS

从进入计算机时代以来&#xff0c;DDoS攻击一直是网络世界中的一大威胁&#xff0c;让无数服务陷入瘫痪。这种攻击的原理非常简单&#xff1a;攻击者使用大量的僵尸主机或蠕虫病毒&#xff0c;向目标服务器发送海量请求&#xff0c;迅速耗尽服务器的资源&#xff0c;使其无法继…

ATF安全漏洞挖掘之FUZZ测试

安全之安全(security)博客目录导读 ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘汇总 目录 一、tf-a-tests简介 二、TF-A SMC_FUZZING 一、tf-a-tests简介 tf-a-tests.git - Trusted Firmware-A Tests 版本下载 tf-a-tests.git - Trusted Firmware-A Tests 文档描述 Getting Star…

大二第三周总结(算法+生活)

算法&#xff1a; 题目&#xff1a;有效的括号 这个题目也是做过很多回了。主要就是数据结构中”栈“的应用&#xff0c;先进后出。 解题思路&#xff1a; 1.创建 Map 哈希表形成键值对映射 2.进行遍历字符串 在遍历过程中 如果 遍历到的字符c 是左括号&#xff0c;则入栈 pu…

【2024秋招】2023-8-5-小红书-数据引擎团队后端开发提前批面经

1 面试官介绍 OLAP引擎&#xff0c;离线引擎&#xff0c;大数据分析中间件 2 自我介绍 缺点&#xff1a; &#xff08;1&#xff09;面试官让重点介绍自己最在行的项目&#xff0c;我真的在自我介绍上扯了一些别的东西… &#xff08;2&#xff09;在面试的时候因为想看简…

学习笔记---0基础+干货满满的单链表专题~~

目录​​​​​​​ 1. 链表的概念及结构&#x1f451; 1.1 什么是链表&#xff1f;&#x1f440; 1.2 为什么需要链表&#xff1f;⁉️ 1.3 链表的结构是怎么样的&#xff1f;❓ 2. 链表的分类&#x1f99c; 3. 实现单链表&#x1faf5; 3.1 要实现的目标&#x1f3af;…

Ubuntu更新镜像源切换

概述 用ubuntu用apt命令&#xff0c;自动安装或更新包的时候&#xff0c;默认的镜像源服务器非常卡&#xff0c;很不方便。切换到国内的镜像源&#xff0c;下载更新非常快。为防止以后忘记&#xff0c;本文以国内服务器阿里巴巴的为例简单描述。 版本 Ubuntu23.10 找到更新…

使用 类加载器 或者 类对象 读取文件(参考的路径都是编译以后的文件夹,out 或者 target 文件夹 )

以下内容 本人都是 用 Maven 工程总结的 &#xff0c;所以会和普通项目的项目目录不太一样。相对路径&#xff1a;项目 的 根目录 开始查找。&#xff08; 但是在我们真正开发的时候&#xff0c;我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面&#xff0c;而是…

OpenAI 现已开始考虑自研 AI 芯片战略

根据 TechCrunch 的报道&#xff0c;随着 AI 芯片短缺的问题日益严重&#xff0c;OpenAI 现已开始考虑自研 AI 芯片。 据悉&#xff0c;从去年开始 OpenAI 内部就已经开始讨论 AI 芯片战略&#xff0c;以解决其 AI 芯片短缺的问题。这些方案包括自研 AI 芯片、与英伟达等芯片制…