当前位置:网站首页>2020-09-04: do you understand the function call convention?
2020-09-04: do you understand the function call convention?
2020-11-06 21:50:00 【Fuda Dajia architect's daily question】
Fogo's answer 2020-09-04:
Primary answer :
stdcall and cdecl Both parameters are passed from right to left .
The difference is stdcall In the called function (Callee) Return to the former , By the called function (Callee) Adjust the stack .cdecl In the called function (Callee) After the return , By the caller (Caller) Adjust the stack , Every function that calls it contains the code to empty the stack , So the size of the resulting executable is larger than that of the call _stdcall The size of the function .
Intermediate answer :
1.__stdcall
In the called function (Callee) Return to the former , By the called function (Callee) Adjust the stack
Parameters are pushed right to left onto the stack .
The function name is automatically underlined before it , Followed by one @ Symbol , It's followed by the size of the parameter .
2.__cdecl
In the called function (Callee) After the return , By the caller (Caller) Adjust the stack .
Function arguments are stacked on the program stack from right to left .
Function results are stored in registers EAX/AX/AL in
Floating point results are stored in registers ST0 in
The compiled function name is prefixed with an underline character
The caller is responsible for ejecting arguments from the thread stack ( Clear the stack )
8 Bit or 16 The actual parameters of plastic surgery are improved to 32 Better than .
Registers affected by function calls (volatile registers):EAX, ECX, EDX, ST0 - ST7, ES, GS
Registers that are not affected by function calls : EBX, EBP, ESP, EDI, ESI, CS, DS
RET Instruction returns from the callee of the function to the caller ( It's essentially reading registers EBP The return address of the function stored at the thread stack and loaded into IP register )
3.__fastcall
__fastcall The main feature of call is fast , Because it transfers parameters through registers .
actually __fastcall use ECX and EDX Send the first two DWORD Or smaller , The remaining parameters are still pushed from right to left , The called function cleans up the memory stack of the transfer parameters before returning .
__fastcall The calling convention adds a “@” Symbol , There's also a “@” Bytes of symbols and their parameters , The format is @function @number , Such as double multi(double a, double b) The modifier name of is @multi@16.
__fastcall and __stdcall Much like the , The only difference is that the first two parameters are passed through registers . Note that the two parameters passed through the register are left to right , That is to say 1 Parameters in ECX, The first 2 Advance in EDX, Other parameters are right to left push , Return still pass EAX.
fastcall Call Convention and stdcall similar , It means that the :
- The first and second of the function DWORD Parameters ( Or smaller ) adopt ecx and edx Pass on , Other parameters are stacked in order from right to left ;
- The called function cleans the stack ;
- The rules for modifying function names are the same as stdcall.
Fast Calling Convention, Quick call Convention . Solve efficiency problems by using registers . characteristic :
Function parameters are passed through registers , The two leftmost of the functions DWORD( The register size is double word ) Or smaller parameters , Pass... By register . The rest is passed from the right to the left stack . Function name adaptation :“@ Function name @ Function parameter byte size decimal ”. Return in the same way __stdcall.
4.__thiscall
thiscall Is the only functional modifier that can't be specified , because thiscall Not a keyword . It is C++ The default calling convention of class member function . Because the member function call has another this The pointer , Therefore, special treatment is necessary ,thiscall signify :
- Parameters are pushed from right to left ;
- If the number of parameters is determined ,this Pointer through ecx Pass to callee ; If the number of parameters is uncertain ,this The pointer is pushed onto the stack after all parameters are pushed onto the stack ;
- Variable number of parameters , The caller cleans the stack , Otherwise, the function cleans the stack itself .
Mainly used to solve this Pointer problem , Use registers to pass this The pointer . Return in the same way __stdcall.
5.__nakedcall
This is a very rare calling convention , General programmers recommend not to use . The compiler does not add initialization and cleanup code to this function , What's more special , Out-of-service return Return return value , Only insert assembly can return the result .
6.__pascal
be based on Pascal Call convention of language , Parameters are put on the stack from left to right ( And cdecl contrary ). The callee is responsible for cleaning the stack before returning . This calling convention is common in the following 16-bit The compiler for the platform :OS/2 1.x, Microsoft Windows 3.x, as well as Borland Delphi edition 1.x.
7.__vectorcall
The purpose is to optimize floating-point vector operations ,intel There are many floating-point vector registers in the processor , The traditional calling convention (stdcall cdecl fastcall thiscall) All through general registers (ecx edx /rcx rdx r8 r9) And stack for parameter passing , So when you call it , Floating point parameters need to be taken from the stack .
It is required to pass parameters in registers as much as possible . The function name is adapted to ”@@ Function name @ Parameter byte number decimal ”. This is Microsoft's own standard .
8.syscall
And cdecl similar , Arguments are pushed right to left onto the stack .EAX, ECX and EDX Values are not preserved . The size of the parameter list is placed in AL In the register (?). syscall yes 32 position OS/2 API Standards for .
9.optlink
Parameters are also pushed onto the stack from right to left . The three character arguments starting from the far left are placed in EAX, EDX and ECX in , Up to four floating-point arguments are passed in ST(0) To ST(3) in ---- Although the space of these four parameters will be reserved on the stack of parameter list . The return value of the function is in EAX or ST(0) in . The Reserved registers are EBP, EBX, ESI and EDI. optlink stay IBM VisualAge It is used in compilers .
10.__clrcall
__clrcall yes C++ .Net Inside .
版权声明
本文为[Fuda Dajia architect's daily question]所创,转载请带上原文链接,感谢
边栏推荐
- 2020-08-15:什么情况下数据任务需要优化?
- 消防器材RFID固定资产管理系统
- ES6 learning notes (2): teach you to play with class inheritance and class objects
- ES6 learning notes (3): teach you to use js object-oriented thinking to realize the function of adding, deleting, modifying and checking tab column
- Markdown tricks
- Using an example to understand the underlying processing mechanism of JS function
- Contract trading system development | construction of smart contract trading platform
- list转换map(根据key来拆分list,相同key的value为一个list)
- 谷歌浏览器实现视频播放加速功能
- The method of realizing high SLO on large scale kubernetes cluster
猜你喜欢
An article taught you to use HTML5 SVG tags
2020-08-15:什么情况下数据任务需要优化?
ES中删除索引的mapping字段时应该考虑的点
2020-08-20:GO语言中的协程与Python中的协程的区别?
Erd-online free online database modeling tool
迅为-iMX6ULL开发板上配置AP热点
Bitcoin once exceeded 14000 US dollars and is about to face the test of the US election
How does cglib implement multiple agents?
【涂鸦物联网足迹】涂鸦云平台全景介绍
An article takes you to understand CSS3 picture border
随机推荐
The native API of the future trend of the front end: web components
2020-08-19:TCP是通过什么机制保障可靠性的?
Application insights application insights use application maps to build request link views
Js数组-数组的用法全在这里(数组方法的重构、数组的遍历、数组的去重,数组的判断与转换)
Code generator plug-in and creator preform file analysis
Qt音视频开发46-视频传输UDP版
What kind of music do you need to make for a complete game?
ES中删除索引的mapping字段时应该考虑的点
STM32F030C6T6兼容替换MM32SPIN05PF
How much disk space does a new empty file take?
win7 APPCRASH(解决方法)(转)
Js字符串-String字符串对象方法
意外的元素..所需元素..
JVM memory allocation - xms128m - xmx512m - XX: permsize = 128M - XX: maxpermsize = 512M
Some operations kept in mind by the front end foundation GitHub warehouse management
html+ vue.js Implementing paging compatible IE
What is the meaning of sector sealing of filecoin mining machine since the main network of filecoin was put online
How to play sortable JS vuedraggable to realize nested drag function of forms
window系统 本机查找端口号占用方法
打工人好物——磨炼钢铁意志就要这样高效的电脑