Linux 调用约定

  函数调用约定是对函数调用时如何传递参数的一种约定。关于它的约定有许多种,下面我们分别从内核接口和用户接口两方面介绍32位和64位Linux的调用约定。

一、内核接口

  x32系统调用约定: Linux系统调用使用寄存器传递参数。eax为syscall_number,ebx、ecx、edx、esi、edi和ebp用于将6个参数传递给系统调用。返回值保存在eax中。
  x64系统调用约定: 内核接口使用的寄存器有rdi、rsi、rdx、rcx、r8和r9。系统调用通过syscall指令完成。系统调用的编号必须在寄存器rax中传递。系统调用的参数限制为6个,不直接从堆栈上传递任何参数。返回时,rax中包含了系统调用的结果。

二、用户接口

  x32函数调用约定: 参数通过栈进行传递。最后一个参数第一个被放入栈中,直到所有的参数都放置完毕,然后执行call指令。这也是Linux上C语言默认的方式。
  x64函数调用约定: x64下通过寄存器传递参数,这样做比通过栈具有更高的效率。它避免了内存中参数的存取和额外的指令。根据参数类型的不同,会使用寄存器或传参方式。如果参数的类型是MEMORY,则在栈上传递参数。如果类型是INTEGER,则顺序使用rdi、rsi、rdx、rcx、r8和r9。所以如果有多于6个的INTEGER参数,则后面的参数在栈上传递。



posted @ 2023-04-25 18:57  liert  阅读(257)  评论(0编辑  收藏  举报