参考: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. PHP 部分语法(二)

    array() 创建数组: 1.数值数组:带数字 ID 键的数组 2.关联数组:带有指定键的数组,键关联一个值 3.多维数组:包含一个或多个数组的数组 $arr = array("Hello ...

  2. sso单点登录系统的压力测试

    环境:vmware centos7.4 2cpu 2核心 工具:ab压力测试工具 测试对象:sso单点登录系统 电脑:win10 4核 项目环境:flask+uwsgi+nginx(uwsgi 2进程 ...

  3. wbr 标签实现连续英文字符的精准换行你知道吗?

    1.一般情况下的换行: word-break:break-all或者word-wrap:break-word <p>大家<wbr>想要<wbr>实现<wbr& ...

  4. Day2 - Python基础2 列表、字符串、字典、集合、文件、字符编码

    本节内容 列表.元组操作 数字操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 ...

  5. Day11 - Python基础11 模块学习——optparse

    Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大 ...

  6. python第二次作业-titanic数据库练习

    一.读入titanic.xlsx文件,按照教材示例步骤,完成数据清洗. titanic数据集包含11个特征,分别是: Survived:0代表死亡,1代表存活Pclass:乘客所持票类,有三种值(1, ...

  7. Istio修改IngressGateway网络类型

    ingressgateway的默认网络类型是LoadBanlancer,在没有外部负载均衡的情况下可以修改为NodePort. 1.修改 kubectl patch service istio-ing ...

  8. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  9. vim 下修改tab键为四个空格

    最近在运行python的时候,发现tab键在在运行过程中无法使用,报错:IndentationError: unindent does not match any outer indentation ...

  10. 使用pymysql模块进行封装,自动化不可或缺的数据库校验

    import pymysql class HandleMysql: ''' 定义一个mysql处理类 ''' def __init__(self, hostname, username, passwo ...