当前位置:网站首页>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-09-03:裸写算法:回形矩阵遍历。
- Road to simple HTML + JS to achieve the most simple game Tetris
- With this artifact, quickly say goodbye to spam messages
- File download manager realized by electron
- [learning] interface test case writing and testing concerns
- 2020-08-20:GO语言中的协程与Python中的协程的区别?
- Es create a new index database and copy the old index library, practice pro test effective!
- What kind of music do you need to make for a complete game?
- How to manage the authority of database account?
- Markdown tricks
猜你喜欢
C and C / C + + mixed programming series 5 - GC collaboration of memory management
Understanding formatting principles
#JVM 类加载机制
To teach you to easily understand the basic usage of Vue codemirror: mainly to achieve code editing, verification prompt, code formatting
Cloudquery v1.2.0 release
[learning] interface test case writing and testing concerns
With this artifact, quickly say goodbye to spam messages
ES6 learning notes (4): easy to understand the new grammar of ES6
2020-08-14:数据任务的执行引擎用的哪些?
C calls SendMessage to refresh the taskbar icon (the icon does not disappear at the end of forcing)
随机推荐
What kind of music do you need to make for a complete game?
2020-08-24:什么是小文件?很多小文件会有什么问题?很多小文件怎么解决?(大数据)
Zero basis to build a web search engine of its own
轻量型 GPU 应用首选 京东智联云推出 NVIDIA vGPU 实例
ES6 learning notes (2): teach you to play with class inheritance and class objects
谷歌浏览器实现视频播放加速功能
打工人好物——磨炼钢铁意志就要这样高效的电脑
What the hell is fastthreadlocal? The existence of ThreadLocal!!
ado.net and asp.net The relationship between
Git remote library rollback specified version
A small goal in 2019 to become a blog expert of CSDN
A concise tutorial for Nacos, ribbon and feign
The legality of IPFs / filecoin: protecting personal privacy from disclosure
非易失性MRAM存储器应用于各级高速缓存
ES6 learning notes (5): easy to understand ES6's built-in extension objects
2020-08-15:什么情况下数据任务需要优化?
Epu360: all the H5 templates you want are here, e-book, big turntable, red envelope rain, questionnaire survey
2020-08-17:详细说下数据倾斜怎么解决?
2020-08-20:GO语言中的协程与Python中的协程的区别?
[byte jumps, autumn recruitment Posts open] ohayoo! Don't leave after school, I want to ask you to play games!!!