x86-64传参规则

  1. 一个参数用rdi(edi)传
  2. 两个参数用rdi、rsi(edi、rsi)传
  3. 三个参数用rdi、rsi、rdx(edi、esi、edx)传
  4. 四个参数用rdi、rsi、rdx、rcx(edi、esi、edx、ecx)传
  5. 五个参数用rdi、rsi、rdx、rcx、r8(edi、esi、edx、ecx、r8)传
  6. 六个参数用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)传

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值