参考:https://bbs.pediy.com/thread-224583.htm

整理成表格方便查询

cdecl(C规范),

stdcall(WinAPI默认),

fastcall,

ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb过程调用标准) ,

thiscall(用于C++中类成员函数)

调用约定\架构 X86 X64 ARM AARCH64
cdecl 参数从右往左依次入栈,调用者实现栈平衡,返回值存放在 EAX 中。 X X X
stdcall 参数从右往左依次入栈,被调用者实现栈平衡,返回值存放在 EAX 中。 X X X
fastcall 

参数1~参数2 分别保存在 ECX、EDX ,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 EAX 中。

参数1~参数4 分别保存在 RCX、RDX、R8D、R9D ,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 RAX 中。

X X
thiscall

参数从右往左依次入栈,

this指针存放ECX中,

被调用者实现栈平衡,

返回值存放在 EAX 中。

参数1~参数3 分别保存在RDX、R8D、R9D中,

this指针存放RCX中,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 RAX 中。

(C++)

参数1~参数3 分别保存在R1~R3中,

this指针存放R0中,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 R0 中。

(C++)

参数1~参数7 分别保存到 X1~X7 寄存器中,

this指针存放X0中,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 X0 中。

ATPCS X X

(C语言)

参数1~参数4 分别保存到 R0~R3 寄存器中 ,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 R0 中。

(C语言)

参数1~参数8 分别保存到 X0~X7 寄存器中 ,

剩下的参数从右往左依次入栈,

被调用者实现栈平衡,

返回值存放在 X0 中。

ARM相关的杂项记录:

ARM 32 64位 指令 B BL BX BR BLX BLR 的区别

  立即数跳(标记地址) 寄存器跳(寄存器地址)
位宽 32或64 32 64
保存LR(返回地址) BL BLR BLX
不保存LR(返回地址) B BR BX

带X 的:BX  BLX 会根据给出的地址的最后一位[0]判断  =0切换为ARM指令模式,=1切换为Thumb指令模式

64位的 RET指令 = mov pc,x30.    x30=LR, 一般配合带L的跳转,如BL,BLX,BLR

C C++ ARM X86 函数 方法 的调用约定的更多相关文章

  1. cocos2d JS-(JavaScript) 基础语法间的函数方法相互调用

    1.函数嵌套函数 function calcuate(opr, a, b) { // 定义函数,opr - -> 符号,a,b - -> 数值 //定义 + 函数 function add ...

  2. Mysql获取字符串中的数字函数方法和调用

    )) ) BEGIN ; ) default ''; set v_length=CHAR_LENGTH(Varstring); DO )) )) ) THEN )); END IF; ; END WH ...

  3. C/C++:函数的调用约定(Calling Convention)和名称修饰(Decorated Name)以及两者不匹配引起的问题

    转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数 ...

  4. C/C++/动态链接库DLL中函数的调用约定与名称修饰

    参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...

  5. java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  6. thinkphp模版调用函数方法

    原文:thinkphp模版调用函数方法 {变量|函数1|函数2|函数3=参数1,参数2,参数3,###} ###为第4个参数,代表变量替换为第4个参数 举例: {$username|substr=0, ...

  7. <?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

    <?php function say() {     echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

  8. python—day9 函数的定义、操作使用方法、函数的分类、函数的嵌套调用

    一.函数的定义 函数的四个组成部分: 函数名. 函数体. 函数返回值. 函数参数 1.概念:重复利用的工具,可以完成特定功能的代码块,函数是存放代码块的容器 2.定义: def:声明函数的关键词 函数 ...

  9. Go - 反射中 函数 和 方法 的调用 - v.Call()

    上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...

随机推荐

  1. mssql sqlserver 如何编写case when 多条件呢?

    摘要: 下文讲述case when中多条件的编写方法,如下所示: 实验环境:sql server 2008 R2  case when 多条件编写方法  case when多条件编写语法: case ...

  2. bay——vSphere Oracle12cR2的RAC搭建安装之配置共享存储 - 副本

    vSphere Oracle12cR2的RAC搭建安装之配置共享存储 https://blog.csdn.net/yuzifen/article/details/82496503 一.第一台机器添加两 ...

  3. bzoj3293 分金币

    题目链接 problem 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使 得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. so ...

  4. mysql执行操作时卡死

    有时候使用Navicat对mysql数据库进行添加字段,truncate或其他操作时会一直卡住不动,后来查看进程才发现一直处于等待状态 先执行,列出所有进程 show full processlist ...

  5. Update 19.11 for Azure Sphere

    今天,微软发布了面向Azure Sphere的19.11更新,其主要亮点就是加入了对开发工具Visual Studio Code和Linux开发环境的支持.具体来讲,本次更新包含3个部分: 1. Az ...

  6. ReactNative: ReactNative初始项目的结构

    一.介绍 初学RN,一切皆新.在上篇中成功地创建并运行了一个React-Native项目,这个demo的基本结构都是系统已经创建好的,开发者在此结构下完成自己的开发即可.分别用Xcode和WebSto ...

  7. VMware下扩展Ubuntu根分区大小

    一.查看磁盘信息 使用df命令用来查看文件系统的磁盘空间占用情况,由下可知我的/dev/sda1分区是挂载在根目录下的,本文目标就是来扩容/dev/sda1分区. 二.下载Gparted工具 Gpar ...

  8. IT兄弟连 HTML5教程 介绍HTML5给你认识 习题

    1.关于HTML5说法正确的是:(C) A.HTML5只是对HTML4的一个简单升级 B.所有主流浏览器都支持HTML5 C.HTML5新增了离线缓存机制 D.HTML5主要是针对移动端进行了优化 2 ...

  9. ActiveMQ是什么,为什么使用MQ

    是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件. 1.系统解耦 采用中间件之后,就可以完美解决上述中因为耦合可能导致的问题.系统 A 不用去 关心下层服务调用方的问题. 2. 异步调 ...

  10. 安装 Java

    1.rpm下载地址 https://download.oracle.com/otn/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm?AuthParam=1570520 ...