Linux x64 ABI
2017-10-17
Linux x64和x86相比,主要区别在于参数的传递上:
-
x86使用栈传递全部参数。
GCC默认将函数参数从右至左push到栈中。由函数调用方负责平衡栈。
-
x64优先使用寄存器传递参数
对于前6个参数,分别使用rdi, rsi, rdx, rcx, r8, r9传递参数。参数超过6个时使用栈传递额外的参数。同样由调用方平衡栈。
二者都使用eax/rax存储函数返回值。
x64调用时,会在call
指令前置空rax,即xor rax, rax
。
许多情况下,也使用sub esp, X
和mov [ebp-X], val
的组合向栈中传递参数。