当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- All the way, I was forced to talk about C code debugging skills and remote debugging
- The isolation level of transaction and its problems
- #JVM 类加载机制
- 2020-08-20:GO语言中的协程与Python中的协程的区别?
- 实验一
- How does cglib implement multiple agents?
- html+ vue.js Implementing paging compatible IE
- Zero basis to build a web search engine of its own
- 消防器材RFID固定资产管理系统
- Vue communication and cross component listening state Vue communication
猜你喜欢

Vue communication and cross component listening state Vue communication

意派Epub360丨你想要的H5模板都在这里,电子书、大转盘、红包雨、问卷调查……
![What grammar is it? ]](/img/3b/00bc81122d330c9d59909994e61027.jpg)
What grammar is it? ]

An article takes you to understand CSS pagination examples

list转换map(根据key来拆分list,相同key的value为一个list)

Detect certificate expiration script

Common mathematical basic formulas of recursive and backtracking algorithms

Epu360: all the H5 templates you want are here, e-book, big turntable, red envelope rain, questionnaire survey

Method of code refactoring -- Analysis of method refactoring

大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
随机推荐
ES6 learning notes (4): easy to understand the new grammar of ES6
jenkins安装部署过程简记
Vue communication and cross component listening state Vue communication
迅为-iMX6ULL开发板上配置AP热点
An article will take you to understand SVG gradient knowledge
STM32F030F4P6兼容灵动微MM32F031F4P6
How does filecoin's economic model and future value support the price of fil currency breaking through thousands
Novice guidance and event management system in game development
The Interpreter pattern of behavior pattern
迅为iMX6开发板-设备树内核-menuconfig的使用
The isolation level of transaction and its problems
[byte jumps, autumn recruitment Posts open] ohayoo! Don't leave after school, I want to ask you to play games!!!
轻量型 GPU 应用首选 京东智联云推出 NVIDIA vGPU 实例
Zhou Jie: database system of East China Normal University
消防器材RFID固定资产管理系统
The 4th China BIM (digital construction) manager Summit Forum will be held in Hangzhou in 2020
Hdu3974 assign the task segment tree DFS order
Event monitoring problem
Js字符串-String字符串对象方法
NAND FLASH的接口控制设计