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

  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

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

X86与ARM平台下的参数传递机制相关推荐

  1. QtCreator动态编译jsoncpp完美支持x86和arm平台

    如果是做嵌入式开发. 在Qt下支持JSon最好的办法,可能不是采用qjson这个库.QJson这个库的实例只提供了x86环境下的编译方法. Installing QJson ------------- ...

  2. 将Linux系统下交叉编译的依赖库推到ARM平台下无法建立以来关系解决

    问题:平常把opencv库使用源码交叉编译好之后,从windows推到飞机里发现,该库的依赖关系都没有了,导致程序运行的时候报该库大小有问题 解决办法: 1.将linux下的库推到ARM平台中的一个文 ...

  3. ARM平台下无线网卡的配置

    ARM平台下无线网卡的配置 前言 看了下上次博客时间,大概是毕业后到目前两个多月了没有更新博客,突然发现自己正在变得越来越懒,这可不是一个好的征兆.除过找工作一个礼拜的时间,算起来已经工作了快2个月了 ...

  4. ARM平台下独占访问指令LDREX和STREX的原理与使用详解

    为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁.为了实现所谓的互斥锁的概念,一般都需要所在平台提供支持. 在计算机领域里,如果要在多线程的情况下要 ...

  5. linux编译x86和arm平台的x264

    摘抄网址:http://blog.csdn.net/baliguan163/article/details/11773363 参考网址:http://blog.csdn.net/evsqiezi/ar ...

  6. 4G通信模块在ARM平台下的应用

    4G模块是连接物与物的重要载体,是终端设备接入物联网的核心部件之一.随着4G的普及,许多新兴市场对4G通信模块的需求都在日益扩大,那么在ARM平台的嵌入式设备上如何快速的应用4G模块呢? 4G通信模块 ...

  7. 4g通信模块怎么连接sim卡_4G通信模块在ARM平台下的应用

    4G模块是连接物与物的重要载体,是终端设备接入物联网的核心部件之一.随着4G的普及,许多新兴市场对4G通信模块的需求都在日益扩大,那么在ARM平台的嵌入式设备上如何快速的应用4G模块呢? 4G通信模块 ...

  8. 4G 通信模块在ARM 平台下的应用

    收藏 评论(0) 分享到 微博 QQ 微信 LinkedIn 4G模块是连接物与物的重要载体,是终端设备接入物联网的核心部件之一,随着4G的普及,许多新兴市场对4G通信模块的需求都在日益扩大,那么在A ...

  9. x86和arm框架下的centOS

    1 CPU架构分为 X86 , ARM ,MIPS , power , ia64 AMD64 = X86_64 = x64 ,是64位的CPU 架构,区分ARM64 1.x86 : 复制指令集cisc ...

最新文章

  1. 动手实践系列:CV语义分割!
  2. varnish Cconfigure
  3. python自动化办公都能做什么菜-Python自动化开发学习之三级菜单制作
  4. python中unique_一个神奇的Python机器学习交互应用开放框架
  5. Android版哆啦A梦连连看游戏源码完整版
  6. fedora如何隐藏顶部状态栏_藏在 iOS 13 里的 9 个隐藏小技巧
  7. 【Java】设计模式在Gourmet咖啡系统中的应用
  8. 一加9 Pro渲染图曝光:6.55英寸曲面屏 左上角打孔
  9. 社区活动 | Apache Flink 1.9 版本即将发布,新版本有哪些新特性?
  10. mysql 随机记录 newid()_sql随机查询数据语句(NewID(),Rnd,Rand(),random())
  11. 医学遗传学词汇英语术语英文(Glossary) 5
  12. Unity 边缘发光HighlightingSystem的使用
  13. 每位程序员必读的书单
  14. 海信LINUX系统改安卓,如何获取海信电视的root许可一键单击海信Smart TV的root卸载内置软件...
  15. 现在PayPal还可以怎样提现???账户只有91刀!
  16. html中的reset(重置)按钮
  17. 环境样品中病毒的富集与检测方法
  18. nodejs追加写入日志文件
  19. 博士申请 | 香港中文大学LaVi Lab王历伟老师招收人工智能全奖博士生
  20. 拼多多产品怎么引流?拼多多商品怎么引更多的流量?

热门文章

  1. github加速插件(google浏览器)
  2. msm8916 lcd 相关调试点指导
  3. Docker之通过阿里云的镜像加速器快速拉取镜像到本地
  4. 软件测试实例-如何测试一个杯子
  5. Android TV使用gsyVideoPlayer快进操作视频会回退
  6. python向excel写数据_Python向excel中写入数据的方法 方法简单
  7. Flyme patchrom项目笔记
  8. Java开发四年,分享我收藏的网站和资源(不看亏一亿)
  9. html5页面适配方法,H5案例分享:HTML5移动页面适配方法
  10. 如何在表格里做计算机统计表,如何运用Excel编制统计表并做一般数据分析?-excel统计怎么做,最简单的统计表格怎么做...