- 一个参数用rdi(edi)传
- 两个参数用rdi、rsi(edi、rsi)传
- 三个参数用rdi、rsi、rdx(edi、esi、edx)传
- 四个参数用rdi、rsi、rdx、rcx(edi、esi、edx、ecx)传
- 五个参数用rdi、rsi、rdx、rcx、r8(edi、esi、edx、ecx、r8)传
- 六个参数用rdi、rsi、rdx、rcx、r8、r9(edi、esi、edx、ecx、r8、r9)传
这里用gcc编了一个小程序用来验证传参规则
source
#include<stdio.h>
void fun1(int a)
{}
void fun2(int a,int b)
{}
void fun3(int a,int b,int c)
{}
void fun4(int a,int b,int c,int d)
{}
void fun5(int a,int b,int c,int d,int e)
{}
void fun6(int a,int b,int c,int d,int e,int f)
{}
void main()
{
int a,b,c,d,e,f;
a=b=c=d=e=f=2;
fun1(a);
fun2(a,b);
fun3(a,b,c);
fun4(a,b,c,d);
fun5(a,b,c,d,e);
fun6(a,b,c,d,e,f);
}
disassemble
0x0000555555554696 <+48>: mov edi,eax
0x0000555555554698 <+50>: call 0x5555555545fa <fun1>//一个参数用edi(rdi)传
0x000055555555469d <+55>: mov edx,DWORD PTR [rbp-0x8]
0x00005555555546a0 <+58>: mov eax,DWORD PTR [rbp-0x4]
0x00005555555546a3 <+61>: mov esi,edx
0x00005555555546a5 <+63>: mov edi,eax
0x00005555555546a7 <+65>: call 0x555555554604 <fun2>//两个参数用edi、rsi(rdi、rsi)传
0x00005555555546ac <+70>: mov edx,DWORD PTR [rbp-0xc]
0x00005555555546af <+73>: mov ecx,DWORD PTR [rbp-0x8]
0x00005555555546b2 <+76>: mov eax,DWORD PTR [rbp-0x4]
0x00005555555546b5 <+79>: mov esi,ecx
0x00005555555546b7 <+81>: mov edi,eax
0x00005555555546b9 <+83>: call 0x555555554611 <fun3>//三个参数用edi、esi、edx(rdi、rsi、rdx)传
0x00005555555546be <+88>: mov ecx,DWORD PTR [rbp-0x10]
0x00005555555546c1 <+91>: mov edx,DWORD PTR [rbp-0xc]
0x00005555555546c4 <+94>: mov esi,DWORD PTR [rbp-0x8]
0x00005555555546c7 <+97>: mov eax,DWORD PTR [rbp-0x4]
0x00005555555546ca <+100>: mov edi,eax
0x00005555555546cc <+102>: call 0x555555554621 <fun4>//四个参数用edi、esi、edx、ecx(rdi、rsi、rdx、rcx)传
0x00005555555546d1 <+107>: mov edi,DWORD PTR [rbp-0x14]
0x00005555555546d4 <+110>: mov ecx,DWORD PTR [rbp-0x10]
0x00005555555546d7 <+113>: mov edx,DWORD PTR [rbp-0xc]
0x00005555555546da <+116>: mov esi,DWORD PTR [rbp-0x8]
0x00005555555546dd <+119>: mov eax,DWORD PTR [rbp-0x4]
0x00005555555546e0 <+122>: mov r8d,edi
0x00005555555546e3 <+125>: mov edi,eax
0x00005555555546e5 <+127>: call 0x555555554634 <fun5>//五个参数用edi、esi、edx、ecx、r8(rdi、rsi、rdx、rcx、r8)传
0x00005555555546ea <+132>: mov r8d,DWORD PTR [rbp-0x18]
0x00005555555546ee <+136>: mov edi,DWORD PTR [rbp-0x14]
0x00005555555546f1 <+139>: mov ecx,DWORD PTR [rbp-0x10]
0x00005555555546f4 <+142>: mov edx,DWORD PTR [rbp-0xc]
0x00005555555546f7 <+145>: mov esi,DWORD PTR [rbp-0x8]
0x00005555555546fa <+148>: mov eax,DWORD PTR [rbp-0x4]
0x00005555555546fd <+151>: mov r9d,r8d
0x0000555555554700 <+154>: mov r8d,edi
0x0000555555554703 <+157>: mov edi,eax
0x0000555555554705 <+159>: call 0x55555555464b <fun6>//六个参数用edi、esi、edx、ecx、r8、r9(rdi、rsi、rdx、rcx、r8、r9)传