调用约定,简而言之就是程序传入参数的不同方法的约定,64位与32位有大量不同。 简单的来说,形如一个函数

read(0,buf,0x200)

拥有3个参数,那这三个参数是如何传入的呢?

32位调用约定

在32位ELF中,所有的参数使用传递,参数从右至左入栈。故32位汇编代码如下:

push 200h
lea  eax, [ebp+buf]
push eax
push 0
call read

64位调用约定

在64位ELF中,前6个参数使用寄存器传递,往后的参数同32位,按照传递,从右至左入栈。前6个参数使用的寄存器的顺序为 rdi, rsi, rdx, rcx, r8, r9 。 故64位汇编代码如下:

mov  rdx, 200h
lea  rax, [rbp+buf]
mov  rsi, rax
mov  rdi, 0h
xor  rax, rax
call read