C C++ ARM X86 函数 方法 的调用约定
参考: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 函数 方法 的调用约定的更多相关文章
- cocos2d JS-(JavaScript) 基础语法间的函数方法相互调用
1.函数嵌套函数 function calcuate(opr, a, b) { // 定义函数,opr - -> 符号,a,b - -> 数值 //定义 + 函数 function add ...
- Mysql获取字符串中的数字函数方法和调用
)) ) BEGIN ; ) default ''; set v_length=CHAR_LENGTH(Varstring); DO )) )) ) THEN )); END IF; ; END WH ...
- C/C++:函数的调用约定(Calling Convention)和名称修饰(Decorated Name)以及两者不匹配引起的问题
转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数 ...
- C/C++/动态链接库DLL中函数的调用约定与名称修饰
参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...
- java本地方法如何调用其他程序函数,方法详解
JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...
- thinkphp模版调用函数方法
原文:thinkphp模版调用函数方法 {变量|函数1|函数2|函数3=参数1,参数2,参数3,###} ###为第4个参数,代表变量替换为第4个参数 举例: {$username|substr=0, ...
- <?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()
<?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()
- python—day9 函数的定义、操作使用方法、函数的分类、函数的嵌套调用
一.函数的定义 函数的四个组成部分: 函数名. 函数体. 函数返回值. 函数参数 1.概念:重复利用的工具,可以完成特定功能的代码块,函数是存放代码块的容器 2.定义: def:声明函数的关键词 函数 ...
- Go - 反射中 函数 和 方法 的调用 - v.Call()
上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...
随机推荐
- 网络编程~~~C/S B/S 架构
C: client 客户端 B: browse 浏览器 S: server 服务器端 C/S架构: 基于客户端与服务端之间的通信 优点: 个性化设置, 响应速度快 缺点: 开发成本和维护成本高, 占用 ...
- ElasticSearch7 设置外网访问失败
elasticsearch外网访问9200端口失败,bootstrap checks failed,the default discovery settings are unsuitable for ...
- Linux:用户权限管理
用户与用户组的概念 超级用户 拥有对系统的最高管理权限,默认是 root 用户 普通用户 只能对自己目录下的文件进行访问和修改,具有登录系统的权限. 虚拟用户 也叫"伪"用户,这类 ...
- CodeForces - 103B(思维+dfs找环)
题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼 ...
- JS---DOM---为元素解除绑定事件
解除绑定事件: 1.解绑事件 对象 .on 事件名字=事件处理函数--->绑定事件. 对象 .on 事件名字 = null . 注意:用什么方式绑定事件,就应该用对应的方式解除绑定事件. //1 ...
- flex.css声明式布局
flex.css能完美的运行在移动端的各种浏览器,甚至能运行在ie10+的各种PC端浏览器中 flex和data-flex flex.css 有两个版本,一个是flex.css一个是data-flex ...
- Sharding-JDBC:单库分表的实现
剧情回顾 前面,我们一共学习了读写分离,垂直拆分,垂直拆分+读写分离.对应的文章分别如下: Sharding-JDBC:查询量大如何优化? Sharding-JDBC:垂直拆分怎么做? 通过上面的优化 ...
- 通过yum在centos安装mysql并配置远程登录
前言 前天按照Oracle上的文档装了一遍mysql,选了最新8.0的版本,后来出现一些问题,网上搜答案,出来的基本还是5.x版本的解决方案,并不适用8.0版本.然后我就去看了一下公司的正式环境买的阿 ...
- IT兄弟连 Java语法教程 数组 使用foreach循环遍历数组元素
从JDK5之后,Java提供了一种更简单的循环:foreach循环,也叫作增强for循环,这种循环遍历数组和集合更加简洁.使用foreach循环遍历数组和集合元素时,无需获得数组或集合的长度,无需根据 ...
- H5混合应用之上下文切换
一.native/web/hybrid 简介 目前主流应用程序大体分为:Native App(原生应用).Web App(网页应用).Hybrid App(混合应用),它们三者的优缺点比较如下表: 应 ...