X86与ARM平台下的参数传递机制

news/2024/11/25 18:23:19/

X86与ARM平台区别参考:一文看懂arm架构和x86架构有什么区别_bleauchat的博客-CSDN博客_arm x86

1. X86下的参数传递

参数传递:

(1)32位程序使用栈传递。

(2)64位程序根据参数的个数而不同, 当参数1~6个,使用寄存器传递;参数大于6个,多出来的参数使用栈传递。

2. ARM下的参数传递

  • AAPCS标准简介

AAPCS(ARM Architecture Procedure Call Standard): ARM架构过程调用标准。它规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则等等……。AAPCS是ATPCS的改进版。

1.1 AAPCS-32

image-20211008213006945

  1. r0-r3(a1-a4) 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。—如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
  2. r4-r8、r10 和 r11(v1-v5、v7 和 v8)被用来存放函数的局部变量。其中,只有 v1-v4 可以被整个 Thumb 指令集统一使用,但 AAPCS 并不要求 Thumb 代码只使用那些寄存器。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
  3. r9 的作用是特定于平台的。不需要这种特殊寄存器的虚拟平台可以将 r9 指定为附加的被调用者保存的变量寄存器 v6。它可以在位置无关数据模型中将其指定为静态基 (SB),或者在具有线程本地存储的环境中将其指定为线程寄存器 (TR)。
  4. r11 可以作为帧指针 FP
  5. r12 是内部调用暂时寄存器 IP。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。
  6. 寄存器 r13 是栈指针 SP。它不能用于任何其它用途。**SP **中存放的值在退出被调用函数时必须与进入时的值相同。
  7. 寄存器 r14 是链接寄存器 LR。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复
  8. 寄存器 r15 是程序计数器 PC。它不能用于任何其它用途。

关于参数与返回值

子程序之间通过寄存器r0 - r3传递子程序前4个参数,剩余参数通过压栈传递,8个字节的double类型由两个寄存器一起传递。

子程序的返回值也使用r0 - r3传递,若是组合类型,超过4字节的将结果存在内存中,然后返回内存地址.

1.2 AAPCS-64

image-20211008220419570

The first eight registers, r0-r7, are used to pass argument values into a subroutine and to return result values from a function. They may also be used to hold intermediate values within a routine (but, in general, only between subroutine calls). Registers r16 (IP0) and r17 (IP1) may be used by a linker as a scratch register between a routine and any subroutine it calls (for details, see §5.3.1.1, Use of IP0 and IP1 by the linker). They can also be used within a routine to hold intermediate values between subroutine calls. The role of register r18 is platform specific. If a platform ABI has need of a dedicated general purpose register to carry inter-procedural state (for example, the thread context) then it should use this register for that purpose. If Procedure Call Standard for the ARM 64-bit Architecture ARM IHI 0055B Copyright © 2010-2013 ARM Limited. All rights reserved. Page 15 of 32 the platform ABI has no such requirements, then it should use r18 as an additional temporary register. The platform ABI specification must document the usage for this register

关于参数传递与返回值:

前八个寄存器 r0-r7 用于将参数值传递给子程序并从函数返回结果值。

参考资料:

  1. C语言在ARM中函数调用时,栈是如何变化的? - 云+社区 - 腾讯云 (tencent.com)
  2. AAPCS - 学习笔记_沉思-CSDN博客_aapcs

http://www.ppmy.cn/news/196312.html

相关文章

oppoR17手机计算机的隐藏功能,OPPO R17 Pro隐藏了很多你不知道的黑科技,让你高效使用手机...

目前智能手机发展得比较快,1年几个样,每次新品发布会均有讲手机的各参数及主要功能,实际手机的很多功能及小技巧不可能在发布会上全部介绍完,我们平常使用时,相信有很多功能没有用完;即将开售的新机R17Pro很…

android-ndk-r17c,Android NDK-使用通过不同API级别编译的库

我有一组用API 19和NDK rev 17的独立工具链编译的C/C库,是否可以在使用API​​ 26(最小SDK目标19)的项目中使用这些库?还是我需要使用API​​ 26重新编译它们? 在脚本中,make_standalone_toolchain.py要求提供–api参数,但是我不确定这是否应为项目中使用…

第7代IGBT模块 FF900R12ME7PB11BPSA1 900A

特征 功率密度大 出色的VCE sat Tvj op 175C过载 改进端子 优化爬电距离,适用于1500V PV应用 PressFIT控制引脚和螺钉电源端子 集成NTC温度传感器 隔离式基板 采用模压端子,设计紧凑而坚固 参数:FF900R12ME7PB11BPSA1(FF900R12M…

cc++编译器配置(交叉编译重要参数)与makefile

编译器与Makefile 文章目录 编译器与Makefilegcc/g/clangclanggccg编译器过程 Makefile什么是MakefileMakefile规则变量include文件搜索其他预定义变量自动变量条件语句输出信息 Android.mkApplication.mk gcc/g/clang 了解c/c编译器的基本使用,能够在后续移植第三方…

【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

文章目录 I . 动态库 与 静态库II . 编译动态库III. Android Studio 使用第三方动态库IV . Android Studio 关键代码V . 博客资源 I . 动态库 与 静态库 1 . 函数库分类 : ① 动态库 , ② 静态库 ; 2 . 静态库 : 编译链接时 , 将整个库文件打包到可执行文件中 , 造成可执行文件…

电路设计基础--光耦接口电路的设计和参数选取--高速光耦TLP109

对于开发工程师来说,看芯片的技术手册是基本功,本例就以光耦的电路为例来讲解一下基本的电路设计过程。 光耦介绍 光耦常用于电气隔离,以免外部进来的信号中混有高压,大电流等脉冲,烧坏我们自己的电路或芯片。比如42…

erlang R17新socket选项{active,N}

erlang R17带来了新的socket选项{active,N} ,与{active,once}一起为应用层提供流量控制。为什么要多了这个选项,{active,once}不是可以有效抑制大量socket消息吗? 我们知道,{active,once}在每次接收到包都要重新设置active选项&a…

栅极驱动参数对IGBT开通的影响

IGBT(Insulated Gate Bipolar Transistor),绝缘栅双极型晶体管,是由BJT(双极型三极管)和MOS绝缘栅型场效应管组成的复合全控型电压驱动式功率半导体器件, 兼有MOSFET的高输入阻抗和GTR的低导通压…