java函数调用约定_2020-09-04:函数调用约定了解么?
福哥答案2020-09-04:
初级回答:
stdcall和cdecl两者的参数传递顺序都是从右向左。
不同点是stdcall在被调用函数 (Callee) 返回前,由被调用函数 (Callee) 调整堆栈。cdecl在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈,每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。
中级回答:
1.__stdcall
在被调用函数 (Callee) 返回前,由被调用函数 (Callee) 调整堆栈
参数从右向左压入堆栈。
函数名自动加前导的下划线,后面紧跟一个@符号 ,其后紧跟着参数的尺寸。
2.__cdecl
在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈。
函数实参在线程栈上按照从右至左的顺序依次压栈。
函数结果保存在寄存器EAX/AX/AL中
浮点型结果存放在寄存器ST0中
编译后的函数名前缀以一个下划线字符
调用者负责从线程栈中弹出实参(即清栈)
8比特或者16比特长的整形实参提升为32比特长。
受到函数调用影响的寄存器(volatile registers):EAX, ECX, EDX, ST0 - ST7, ES, GS
不受函数调用影响的寄存器: EBX, EBP, ESP, EDI, ESI, CS, DS
RET指令从函数被调用者返回到调用者(实质上是读取寄存器EBP所指的线程栈之处保存的函数返回地址并加载到IP寄存器)
3.__fastcall
__fastcall调用的主要特点就是快,因为它是通过寄存器来传送参数的。
实际上__fastcall用ECX和EDX传送前两个DWORD或更小的参数,剩下的参数仍自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈。
__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@function @number ,如double multi(double a, double b)的修饰名是@multi@16。
__fastcall和__stdcall很象,唯一差别就是头两个参数通过寄存器传送。注意通过寄存器传送的两个参数是从左向右的,即第1个参数进ECX,第2个进EDX,其他参数是从右向左的入栈,返回仍然通过EAX。
fastcall调用约定和stdcall类似,它意味着:
函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压栈;
被调用函数清理堆栈;
函数名修改规则同stdcall。
Fast Calling Convention,快速调用约定。通过使用寄存器解决效率问题。特点:
函数参数部分通过寄存器传递,函数中最左的两个DWORD(寄存器大小是双字)或者更小的参数,通过寄存器传递。剩下的从右到左堆栈传递。 函数名改编:“@函数名@函数参数字节大小十进制”。 返回方式同__stdcall。
4.__thiscall
thiscall是唯一一个不能明确指明的函数修饰,因为thiscall不是关键字。它是C++类成员函数缺省的调用约定。由于成员函数调用还有一个this指针,因此必须特殊处理,thiscall意味着:
参数从右向左入栈;
如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入堆栈;
对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。
主要用于解决this指针问题,使用寄存器传递this指针。返回方式同__stdcall.
5.__nakedcall
这是一个很少见的调用约定,一般程序设计者建议不要使用。编译器不会给这种函数增加初始化和清理代码,更特殊的是,不能用return返回返回值,只能用插入汇编返回结果。
6.__pascal
基于Pascal语言的调用约定,参数从左至右入栈(与cdecl相反)。被调用者负责在返回前清理堆栈。 此调用约定常见在如下16-bit 平台的编译器:OS/2 1.x,微软Windows 3.x,以及Borland Delphi版本1.x。
7.__vectorcall
目的是用来优化浮点向量运算,intel处理器种有很多浮点向量寄存器,传统的调用约定(stdcall cdecl fastcall thiscall) 都是通过通用寄存器(ecx edx /rcx rdx r8 r9)以及堆栈进行参数传递,所以调用的时候,浮点参数需要从栈获取。
要求尽可能在寄存器中传递参数。函数名改编为”@@函数名@参数字节数十进制”。这是微软自己添加的标准。
8.syscall
与cdecl类似,参数被从右到左推入堆栈中。EAX, ECX和EDX不会保留值。参数列表的大小被放置在AL寄存器中(?)。 syscall是32位OS/2 API的标准。
9.optlink
参数也是从右到左被推入堆栈。从最左边开始的三个字符变元会被放置在EAX, EDX和ECX中,最多四个浮点变元会被传入ST(0)到ST(3)中----虽然这四个参数的空间也会在参数列表的栈上保留。函数的返回值在EAX或ST(0)中。保留的寄存器有EBP, EBX, ESI和EDI。 optlink在IBM VisualAge编译器中被使用。
10.__clrcall
__clrcall是C++ .Net里面的。
java函数调用约定_2020-09-04:函数调用约定了解么?相关推荐
- 黑马程序员 一步一步往上爬 学习毕老师java视频的第03,04天
---------------------- <a href="http://edu.csdn.net/heima" target="blank"> ...
- 【2022.09.04】关于升级打怪学编程活动的通知
把电子学会全国青少年软件编程等级考试作为游戏的关卡,带着小朋友们升级打怪. 升级打怪计划 每周日晚20:00,我在腾讯会议中进行直播答疑,解决小朋友们本周遇到的编程问题,辅助小朋友们提升编程的技能. ...
- 笔记整理2----Java语言基础(二)06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础
06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础 第06天 java基础语法 今日内容介绍 Eclipse断点调试 基 ...
- 『金融帝国实验室』(Capitalism Lab)〔房地产DLC〕最新开发动态(2022.09.04)
『金融帝国实验室』(Capitalism Lab)游戏开发商Enlight Software于2022.09.04在官方论坛(https://www.capitalism2.com/forum/vie ...
- Java随堂小记09(GUI)
Java随堂小记09 异常处理机制 自定义异常 GUI编程 Frame窗口 Panel 面板 三种布局管理器 流式布局 FlowLayout:从左到右 东南西北中 BorderLayout 表格布局 ...
- C/C++函数调用时参数传递过程、调用约定与可变参函数的实现
目录 1.参数传递过程 2.参数压栈顺序从右至左的影响 3.调用约定 3.1.__cdecl C/C++ 缺省调用约定 3.2. __stdcall调用约定 3.3. __fastcall (快速调用 ...
- OpenJDK源码赏析之二:java虚拟机启动流程到首函数调用全流程
承接上一谈 OpenJDK源码赏析之一:漫谈java的历史渊源_星空_AZ的博客-CSDN博客 JAVA从启动到第一个函数执行的发生的流程: WinMain->JLI_Launch->JV ...
- java面试题_2020年1-6月份Java面试题总结,20多类1100道面试题含答案解析
很多程序员都会担心35岁的职业危机,而数据也显示,40岁以上的程序员几乎不存在,大都转了管理岗,余下的只能被迫离职或者转行.然而,太久待在舒适区,可能连小公司的面试,都很难通过了. 程序员是最需要 ...
- python入门之函数调用educoder_Educode Python入门之函数调用
题目链接:https://www.educoder.net/tasks/6248hanifqvu 第1关:内置函数 - 让你偷懒的工具 #coding=utf-8 # 输入一个整数n n = int( ...
- 函数调用关系python_追踪python函数调用关系
在我们执行拥有复杂函数调用关系的一段python程序时,我们希望能够清楚的知道他们之间的调用关系以及在调用过程中传入的参数信息和返回值,这些信息对于我们分析程序的行为和bug会很有帮助. 我希望能实现 ...
最新文章
- python 发布包_如何将自己的Python包发布到PyPI
- OvS v.s. OvS-DPDK v.s. VPP
- django-allauth定制模板(转载)
- db2 创建样本数据库_db2创建数据库
- 如何在报表中实现算法的可挂接需求
- Android中的savedInstanceState
- 2-6 刮刮乐和双色球
- pytorch关系抽取框架OpenNRE源码解读与实践:PCNN ATT
- 最简单的三步yum配置阿里源
- 华为交换机路由器登陆密码详细操作
- Linux系统文件颜色代表的意思
- 明源售楼系统技术解析 房源生成(二)
- geforce rtx3090显卡安装cuda11.0
- java 走马灯程序_微信小程序实现简单跑马灯效果
- 流数据分析之地理围栏应用
- Python类与对象最全总结大全(类、实例、属性方法、继承、派生、多态、内建函数)
- rg1 蓝光危害rg0_新国标:你的LED台灯防蓝光危害评估结果是RG0吗?
- PCTI8戴杨明同学在try2u.com【附上海试优网简介】
- win7使用命令提示符怎么运行C语言,怎么有效的解决win7系统的命令提示符打开
- 【MySQL】数据库设计文档生成
热门文章
- python线程同步锁_[python] 线程间同步之Lock RLock
- python计算结果传给spark_Spark入门:流计算简介(Python版)
- eclipse配置python开发环境_eclipse怎样搭建Python开发环境
- php curl 关闭tcp连接,BASH CURL:顺序运行时,请勿关闭请求之间的连接
- vc++中画线时xor_C ++'xor_eq'关键字和示例
- des加密密码补位_密码学中的数据加密标准(DES)
- 分布式映射与集中式映射_K映射上的表达式映射和组包围
- 阿里为什么推荐使用LongAdder,而不是volatile?
- js使用location的方法实验
- 十三、PyQt5的QFileDialog文件打开、文件保存、文件夹选择对话框