MozhuCY's blog.

Calling Convention

字数统计: 284阅读时长: 1 min
1970/01/01 Share

函数调用约定:对函数调用时如何传递参数的一种约定.

调用函数前会先将函数参数压栈,在传递给函数,栈的大小被存储在PE头中.

  • cdexl
    主要在C语言中使用的方式,调用者负责处理堆栈.
1
2
3
4
5
6
7
#include<stdio.h>
int add(int a,int b){
return (a + b);
}
int main(int argc,char * argv[]){
return add(1,2);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUSH EBP
MOV EAX,ESP
MOV EAX,DWORD PTR SS:[EBP + 8]
MOV EAX,DWORD PTR SS:[EBP + C]
POP EBP
RETN
INT3
INT3
INT3
INT3
INT3
INT3
PUSH EBP
MOV EBP,ESP
PUSH 2
PUSH 1
CALL 0X00401000
ADD ESP,8
POP EBP
RET
  • stdcall
1
2
3
4
5
6
7
#include<stdio.h>
int add(int a,int b){
return (a + b);
}
int main(int argc,char * argv[]){
return add(1,2);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUSH EBP
MOV EAX,ESP
MOV EAX,DWORD PTR SS:[EBP + 8]
MOV EAX,DWORD PTR SS:[EBP + C]
POP EBP
RETN 8 --> RETN
INT3
INT3
INT3
PUSH EBP
MOV EBP,ESP
PUSH 2
PUSH 1
CALL 0X00401000
NOP --> ADD ESP,8
POP EBP
RET

常用于WIN32 API,清理栈时,代码尺寸要小.

  • fastcall

常使用寄存器来传递参数,例如,4个参数,则前两个参数分别使用ECX EDX来传递.当函数调用复杂时,exc和edx先前的数据需要先备份,如果在函数调用时运用到ecx edx 则现将参数备份.

CATALOG
  1. 1. 函数调用约定:对函数调用时如何传递参数的一种约定.