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 中的 ...
随机推荐
- Saltstack_使用指南14_无master
1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...
- 通过官网模板轻松实现Grafana的可视化界面配置(以MySQL监控项为例)
我们知道可视化是监控的一个重要环节,所以往往我们这个环节花费大量的时间和精力.可是如果可以借鉴前辈的经验和成果,可以事半功倍.Grafana 有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编 ...
- sched_yield()和nanosleep()对进程调度的影响
关键词:sched_yield().nanosleep()等等. sched_yield()主动放弃CPU执行权,nanosleep()是睡眠一段时间后再唤醒. 1. sched_yield()实现 ...
- Fiddler 过滤图片
fiddler过滤无用图片操作步骤1.在右侧Filters中勾选 Hide if URL contains 2.在 Hide if URL contains 中加入下面一行过滤图片代码 REGEX:( ...
- spring mongodb用法
A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the '_id' fiel ...
- 四、排序算法总结二(归并排序)(C++版本)
一.什么是归并排序? 归并排序是基于分而治之的思想建立起来的. 所谓的分而治之,也就是将一个数据规模为N的数据集,分解为两个规模大小差不多的数据集(n/2),然而分别处理这两个更小的问题,就相当于解决 ...
- cf 之lis+贪心+思维+并查集
https://codeforces.com/contest/1257/problem/E 题意:有三个集合集合里面的数字可以随意变换位置,不同集合的数字,如从第一个A集合取一个数字到B集合那操作数+ ...
- cf之 前缀和差分
给定一个n×n的WB矩阵,给定一个k∗k的能把B变成W的橡皮擦,求橡皮擦作用一次后,全为W的行.列总数最大值 连接:http://codeforces.com/contest/1200/problem ...
- 趣谈Linux操作系统学习笔记:第二十五讲
一.mmap原理 在虚拟内存空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同内存块,这个变量名字叫mmap struct mm_struct { str ...
- 【swoole】结合swoole 和 nsq 的实际应用
集合 swoole 的框架设计 为了减少理解度,我尽量的从源头开始引入 1. nsq 案例中是使用 swoole 结合一个php 框架实现的是 NSQ 订阅功能. 启动命令: sudo bash /w ...