调用约定,简而言之就是程序传入参数的不同方法的约定,64位与32位有大量不同。 简单的来说,形如一个函数
read(0,buf,0x200)拥有3个参数,那这三个参数是如何传入的呢?
32位调用约定
在32位ELF中,所有的参数使用栈传递,参数从右至左入栈。故32位汇编代码如下:
push 200h
lea eax, [ebp+buf]
push eax
push 0
call read64位调用约定
在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