当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- 统计项目代码行数
- Common mathematical basic formulas of recursive and backtracking algorithms
- ES6 learning notes (4): easy to understand the new grammar of ES6
- All the way, I was forced to talk about C code debugging skills and remote debugging
- The role of theme music in games
- Event monitoring problem
- vue3 新特性
- Interviewer: how about shardingsphere
- Understanding formatting principles
- Summary of front-end interview questions (C, s, s) that front-end engineers need to understand (2)
猜你喜欢
Stickinengine architecture 11 message queue
The method of realizing high SLO on large scale kubernetes cluster
2020-09-09:裸写算法:两个线程轮流打印数字1-100。
Some operations kept in mind by the front end foundation GitHub warehouse management
行为型模式之解释器模式
window系统 本机查找端口号占用方法
Es create a new index database and copy the old index library, practice pro test effective!
[learning] interface test case writing and testing concerns
轻量型 GPU 应用首选 京东智联云推出 NVIDIA vGPU 实例
All the way, I was forced to talk about C code debugging skills and remote debugging
随机推荐
Zero basis to build a web search engine of its own
C calls SendMessage to refresh the taskbar icon (the icon does not disappear at the end of forcing)
2020-09-09:裸写算法:两个线程轮流打印数字1-100。
消防器材RFID固定资产管理系统
Bitcoin once exceeded 14000 US dollars and is about to face the test of the US election
Elasticsearch database | elasticsearch-7.5.0 application construction
Epu360: all the H5 templates you want are here, e-book, big turntable, red envelope rain, questionnaire survey
ES6 learning notes (2): teach you to play with class inheritance and class objects
The native API of the future trend of the front end: web components
The method of local search port number occupation in Windows system
Event monitoring problem
Stickinengine architecture 12 communication protocol
意派Epub360丨你想要的H5模板都在这里,电子书、大转盘、红包雨、问卷调查……
Ora-02292: complete constraint violation (midbjdev2.sys_ C0020757) - subrecord found
File download manager realized by electron
Hdu3974 assign the task segment tree DFS order
2020-08-17:详细说下数据倾斜怎么解决?
Pn8162 20W PD fast charging chip, PD fast charging charger scheme
Erd-online free online database modeling tool
C and C / C + + mixed programming series 5 - GC collaboration of memory management