首页 > 其他分享 >ARM结构下函数被调用时参数是如何传递的

ARM结构下函数被调用时参数是如何传递的

时间:2024-10-12 10:21:22浏览次数:8  
标签:调用 函数 传递 参数 AAPCS 寄存器 ARM

在ARM架构下,函数调用的参数传递遵循特定的调用约定,这些调用约定定义了如何在函数调用中传递参数、返回值以及保存寄存器的规则。ARM架构可采用不同的调用约定,但最常用的是ARM的标准调用约定,也称作AAPCS(ARM Architecture Procedure Call Standard)。

AAPCS(ARM Architecture Procedure Call Standard)

根据AAPCS,函数参数传递的规则如下:

  1. 寄存器传递:前四个整数或指针参数通过通用寄存器 R0 到 R3 传递;如果参数是浮点数或双精度数,则使用浮点/向量寄存器 S0 到 S15/D0到D7。如果函数有超过四个参数,那么会使用堆栈来传递剩余的参数。

  2. 堆栈传递:超过四个的参数会被压入栈中,并且栈的传递通常从右向左进行,即最后一个参数先压栈。函数调用完成后,由调用者负责清理这些参数。

  3. 结构体传递:小的结构体通常被视为整数或浮点数并放入寄存器中;如果结构体太大,不能放入寄存器,或寄存器已经用尽,则会将结构体传递到堆栈上。

  4. 返回值:返回值(如果是整数或指针)通过 R0 寄存器传递,如果是浮点数,则通过 S0/D0 寄存器传递。对于更复杂的返回值(如大型结构体),通常通过隐藏的指针传递,这个指针指向调用者分配的空间,在函数内填充返回值。

  5. 保存寄存器:R0-R3 和 S0-S15/D0-D7 寄存器在函数调用时不必保存(即调用者保存),它们可以被任何函数自由使用和覆写。R4-R11 是可保存的寄存器,如果在函数中使用,需要在进入函数时保存旧值,并在返回前恢复。R12 通常被作为 intra-procedure-call scratch register。

  6. 栈对齐:在AAPCS中,栈必须保持8字节对齐。

不同的编译器和操作系统可能有特定的调用约定,因此在混合不同编译器或语言开发的项目中,需要注意调用约定的差异。例如,在Linux上使用GCC编译器时,通常遵循AAPCS。在实际开发中,更多细节需要参考具体的编译器和架构的文档。

标签:调用,函数,传递,参数,AAPCS,寄存器,ARM
From: https://www.cnblogs.com/peifx/p/18459997

相关文章

  • JavaScript 第4章:函数与作用域
    在JavaScript中,函数是程序设计中的重要组成部分,它们用于封装一段代码以执行特定的任务。下面我们将逐一探讨第4章提到的各个概念。1.函数声明vs函数表达式函数声明(FunctionDeclaration)是使用function关键字定义一个函数,并给它命名的一种方式。这种方式定义的函数会......
  • x86架构和ARM架构有什么区别?
    x86架构和ARM架构是当今两种主要的处理器架构,它们在设计哲学、指令集、能效比、应用场景等方面有显著的区别:指令集架构(ISA):x86/x86-64:这是英特尔和AMD主导的一种复杂指令集计算机(CISC)架构。x86原本指的是32位处理器,而x86-64(或AMD64)是其扩展,支持64位处理。CISC架构的特点是拥......
  • 传输层密码协议(TLCP)伪随机函数 PRF 研究
    TLCP概述TLCP是利用密码技术,为两个应用程序之间提供保密性和数据的完整性。协议用的密码算法包含非对称密码算法、分组密码算法、密码杂凑算法、数据扩展函数和伪随机函数、协议用到的密钥种类包含服务端密钥、客户端密钥、预主密钥、主密钥和工作密钥。密钥种类服务端......
  • 文件工具类 - C#小函数类推荐
          此文记录的是文件工具类。/***文件工具类AustinLiu刘恒辉ProjectManagerandSoftwareDesignerE-Mail:[email protected]:http://lzhdim.cnblogs.comDate:2024-01-1515:18:00***/namespaceLzhdim.LPF.Utility......
  • R语言使用randomForest包中的randomForest函数构建随机森林模型、使用importance函数
    R语言使用randomForest包中的randomForest函数构建随机森林模型、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB(out-of-bagerrorestimate)目录R语言使用randomForest包中的randomForest函数构建随机森林模型(Randomfores......
  • 实验6 函数
    1、素数之和【问题描述】编写函数判断一个数是否为素数,在主函数中输入整数n,计算并输出1~n间的所有素数之和,若n<2,则输出error!  (n<=10000)【输入形式】整数n【输出形式】1~n间的所有素数之和【样例输入】100【样例输出】1060【样例输入】-1【样例输出】error!#def......
  • C++常用库函数
    大小写转换islower/isupper函数用于检查一个字符是否为小写或大小字母,需要包含头文件<cctype>,也可以包含万能头文件<bits/stdc++.h>.函数返回值类型为bool类型。intmain(){ charch1='A'; charch2='b'; //使用islower函数判断是否为小写字母 if(islower......
  • C(十五)函数综合(一)--- 开公司吗?
    在这篇文章中,杰哥将带大家“开公司”。主干内容部分(你将收获):......
  • c语言模拟实现库函数 strlen strcpy strcat strcmp strstr
    一、模拟实现库函数strlen解释:strlen是求字符串长度的,求出的长度是不可能为负数所以返回类型设置为size_t也是合情合理的 typedefunsignedintsize_t\注意字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')。size_......
  • 20241011-1 字符串函数自写
    #include<stdio.h>#include<string.h>unsignedintmystrlen(char*str){ unsignedintcount=0; while('\0'!=*(str++)) { count++; } returncount;}/*str1:目的字符串str2:源字符串*/voidmystrcpy(char*str1,char*str2){ ch......